如何根据值选择要更新的列

jtw3ybtb  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(267)

我有一个表,其中有1个主键列a,1个不可为null的外键列b和5个可为null的外键列c、d、e、f、g。
我必须在值x是主键的行中插入值y:
如果表中不存在x,则必须使用以下内容创建新行:

INSERT INTO table(a, b) VALUES (X, Y)

如果x在表中,而b包含一个值,我必须在c列中设置y:

UPDATE table SET c = Y

如果x出现在表中,并且b和c包含一个值,我必须在d列中设置y:

UPDATE table SET d = Y

等等;如果行已满,则不必执行任何操作。
如何在工作查询中转换此内容?注意,我使用的是mysql。谢谢。

lzfw57am

lzfw57am1#

你可以用 INSERT ... ON DUPLICATE KEY UPDATE 使用键更新行 X 如果存在的话。列需要设置为 X 如果是的话 NULL 而其“前身”并非如此 NULL (除 c 作为 b 已声明 NOT NULL ). 可以用 CASE ... END .

INSERT INTO table
            (a,
             b)
            VALUES (X,
                    Y)
       ON DUPLICATE KEY UPDATE c = CASE
                                     WHEN c IS NULL
                                       THEN Y
                                     ELSE
                                       c
                                   END,
                               d = CASE
                                     WHEN d IS NULL
                                          AND c IS NOT NULL
                                       THEN Y
                                     ELSE
                                       d
                                   END,
                               e = CASE
                                     WHEN e IS NULL
                                          AND d IS NOT NULL
                                       THEN Y
                                     ELSE
                                       e
                                   END,
                               f = CASE
                                     WHEN f IS NULL
                                          AND e IS NOT NULL
                                       THEN Y
                                     ELSE
                                       f
                                   END,
                               g = CASE
                                     WHEN g IS NULL
                                          AND f IS NOT NULL
                                       THEN Y
                                     ELSE
                                       g
                                   END;

相关问题