mysql 是否根据子表中存在的行更新表?

9o685dep  于 2023-03-07  发布在  Mysql
关注(0)|答案(1)|浏览(128)

这解释起来有点混乱,但基本上我有一个父表fruits和一个子表fruits_sub,后者通过外键fruits_id引用fruits
水果:
| 水果_id|编号_0列|编号_1列|
| - ------|- ------|- ------|
| 1个|无|1个|
| 第二章|无|1个|
水果子样本:
| 水果_id|枚举|
| - ------|- ------|
| 1个|无|
| 1个|1个|
fruits_sub中行的存在是事实的来源,它告诉我们是否应该在fruits表中启用相应的枚举列。例如,如果我们查看fruits_subfruits_id为1的行,则有两个enum为0和1的条目。这意味着在fruits中,应启用enum_0_colenum_1_col(设置为值1)。但是,enum_0_col被错误地设置为0,所以我想更新表并将其设置为1。fruits_sub表中完全缺少2的fruits_id,这意味着在fruits中,该行应该将enum_0_colenum_0_col都设置为0,我希望更新表以反映这一点。
这是一个查询,我试图找出哪些条目对于0的枚举有"不匹配":

CASE 
    WHEN
        NOT EXISTS ( SELECT fruits_id FROM fruits_sub
        WHERE enum = 0 )
    THEN
        SELECT * from fruits 
        WHERE fruits.fruits_id = fruits_sub.fruits_id
        AND fruits.enum_0_col = 1
    WHEN
        EXISTS ( SELECT fruits_id from fruits_sub
        WHERE enum = 0 )
    THEN
        SELECT * FROM fruits
        WHERE fruits.fruits_id = fruits_sub.fruits_id
        AND fruits.enum_0_col = 0
END

然后,我对枚举1执行了一个类似的查询。我发现上面的查询存在语法错误,我猜可能是因为我无法在两个不同的表上执行select子句

zxlwwiss

zxlwwiss1#

要使“fruits”表与“fruits_sub”表保持同步,实际上需要:

  • 更新现有行以反映正确的枚举值
  • 为“fruits_sub”中存在但“fruits”中不存在的任何“id”添加新的“fruits”行
  • 删除“fruits_sub”中不存在“id”的任何现有“fruits”行

(我现在将这些保持得相对简单,所以希望您能够很容易地辨别出在每个步骤中到底发生了什么)
首先删除现有的“fruits”行(其中没有对应的“fruits_sub”行):

DELETE FROM fruits 
WHERE fruits_id NOT IN
(
    SELECT fruits_id FROM fruits_sub
)

插入新行(枚举值首先默认为零,然后更新):

INSERT INTO fruits
SELECT
   fs.fruits_id, 0, 0
FROM fruits_sub fs
LEFT OUTER JOIN fruits f
   ON f.fruits_id = fs.fruits_id
WHERE f.fruits_id Is Null

根据现有的“fruits_sub”枚举,更新现有的“fruits”行:

UPDATE f
SET enum_0_col = 
CASE
   WHEN EXISTS
   (
      SELECT 1 FROM fruits_sub fs
      WHERE fs.fruits_id = f.fruits_id
      AND fs.enum = 0
   )
   THEN 1
   ELSE 0
END,
SET enum_1_col = 
CASE
   WHEN EXISTS
   (
      SELECT 1 FROM fruits_sub fs
      WHERE fs.fruits_id = f.fruits_id
      AND fs.enum = 1
   )
   THEN 1
   ELSE 0
END
FROM fruits f

相关问题