我的问题是我在一张桌子上有多个唯一键。
- 插入忽略不是一个选项,因为它会抑制错误。
- MySQL 不支持语句之外的任何类型的条件(例如 if (cond) then insert else don't insert)
- 存储过程不是一个选项(我可以使用 if/else 语句的唯一地方)
- 在重复键上可能会使用新值更新键,但我希望唯一键不会更改,以防唯一约束失败。
所以唯一的选择是重复只是不更新任何东西。有什么办法可以做到这一点?或者还有其他选择吗?
我的问题是我在一张桌子上有多个唯一键。
所以唯一的选择是重复只是不更新任何东西。有什么办法可以做到这一点?或者还有其他选择吗?
如果您不想ON DUPLICATE KEY UPDATE
实际执行任何操作,只需将列值设置为现有值。与使用关键字不同,其他冲突(例如外键约束)会冒泡IGNORE
,但冲突时不会更改任何值。
INSERT INTO table (value1, value2) VALUES ('1', '2')
ON DUPLICATE KEY UPDATE value1 = value1;
如果要确保在发生冲突时不会更改有效数据,可以将包含任意数据的列添加到表中,并将其用于UPDATE
语句。
如果您希望将所有逻辑保留在应用程序中而不是数据库中,则第三种选择是首先运行SELECT
语句以在运行语句之前检查潜在的冲突INSERT/UDPATE
。
尽管排除了您的方案,但存储过程也可以在单个数据库调用中提供此逻辑。
找到另一种选择,以防有人偶然发现此问题。
如果您的表有一个自动递增的主键,您可以像这样更新 pk:
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;