【发布时间】:2023-04-09 21:31:01
【问题描述】:
请注意,我无法通过在表上放置UNIQUE 约束来解决此问题。这是业务逻辑:如果要放置在某列中的值为 N,我们允许重复行。对于任何其他值,我们不会。
所以在检查传入参数的值并发现它不是我们允许欺骗的值之后,我这样做:
INSERT INTO userItems
VALUES ('0AA4DC20-5038-4A24-100F4DB16C6A', '1qubydk59mo059x4w2q99c', 'like', NULL)
WHERE NOT EXISTS (SELECT * FROM userItems WHERE userID = '0AA4DC20-5038-4A24-100F4DB16C6A' AND itemID = '1qubydk59mo059x4w2q99c' AND action = 'like')
这会导致:“检查与您的 MySQL 服务器版本相对应的手册,以获取在 WHERE NOT EXISTS (SELECT * FROM user... 附近使用的正确语法
使用IF NOT EXISTS 也不起作用。也试过这个:
IF NOT EXISTS (SELECT * FROM userItems WHERE userID = '0AA4DC20-5038-4A24-100F4DB16C6A' AND itemID = '1qubydk59mo059x4w2q99c' AND action = 'like')
THEN
INSERT INTO userItems VALUES ('0AA4DC20-5038-4A24-100F4DB16C6A', '1qubydk59mo059x4w2q99c', 'like', NULL)
END IF
使用SELECT(按照建议)代替VALUES 提供值不会插入任何内容,即使在独立语句中也是如此。这个:
INSERT INTO userItems (SELECT '541C3FFB-0711-4949-AD23-538B19F598D6', '10sz61gbuo2k11938s', 'like', NULL FROM userItems)
不做任何事情(没有插入行,即使表完全为空)。
但是VALUES 可以:
INSERT INTO userItems VALUES ('541C3FFB-0711-4949-AD23-538B19F598D6', '10sz61gbuo2k11938s', 'like', NULL)
【问题讨论】:
-
WHERE NOT EXISTS应该是 select 语句的一部分,它不适用于VALUES。