我的问题是我在桌子上有多个唯一键。
所以唯一的选择是重复只是不更新任何东西。有什么办法可以实现吗?或者还有其他选择吗?
答案 0 :(得分:17)
如果您希望ON DUPLICATE KEY UPDATE
实际上不执行任何操作,只需将列值设置为现有值即可。与使用IGNORE
关键字不同,其他冲突(如外键约束)会冒出来,但冲突时不会改变任何值。
INSERT INTO table (value1, value2) VALUES ('1', '2')
ON DUPLICATE KEY UPDATE value1 = value1;
如果要确保在发生冲突时没有有效数据更改,可以将包含任意数据的列添加到表中,并将其用于UPDATE
语句。
如果您希望将所有逻辑保留在应用程序而不是数据库中,则第三个选项是在运行SELECT
语句之前首先运行INSERT/UDPATE
语句以检查潜在的冲突。
虽然排除了您的方案,但存储过程也可以在单个数据库调用中提供此逻辑。
答案 1 :(得分:-1)
找到另一个选项,以防有人遇到此问题。
如果您的表具有自动增量主键,则可以像这样更新pk:
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;