我需要更新mySQL数据库中的一行,但是在存在约束的情况下不可能这样做。
约束要求两列的组合是唯一的。
例如,firstname和lastname字段必须是唯一的。 SHOW CREATE TABLE
个用户可能包含以下内容:
UNIQUE KEY `uniquePortTermCode` (`firstname`,`lastname`)
当我尝试更新时,我违反了此密钥,因此收到错误:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'Bob-Smith' for key 'uniqueFirstnameLastname'
让我们说我需要用相同的姓氏交换两个用户的名字。所以我想把Bob Smith设置为Jim Smith,我想把Jim Smith设置为Bob Smith。当我尝试第一个更新语句时,我将遇到唯一的键错误。
我认为解决方法是SET foreign_key_checks=0
,但因为变量表明这只是外键,而不是唯一键,所以我仍然得到错误。
我也看到mySQL unique_checks
中有一个变量,但是将其设置为false仍然无法解决我的问题而且我仍然会收到错误。
有没有办法忽略唯一键,同时执行此操作而不像滑动拼图那样更改数据?
答案 0 :(得分:0)
如果你想交换" Bob Smith"和#34;吉姆史密斯",您可以通过三次更新来完成:
update table t
set firstname = 'In the process of swapping names from Bob to Jim'
where firstname = 'Bob' and lastname = 'Smith';
update table t
set firstname = 'Bob'
where firstname = 'Jim' and lastname = 'Smith';
update table t
set firstname = 'Jim'
where firstname = 'In the process of swapping names from Bob to Jim' and lastname = 'Smith';
我建议将它们包装在一个事务中,以便它们在逻辑上作为单个块执行,并将其放入存储过程中。
另一种方法是删除或禁用对表的检查。这会产生影响 - 在多用户环境中,其他线程可能会出错。或者,系统可能会关闭并重新启动检查。
这种方法可能发生的最坏情况是记录得到一个非常尴尬的名字,可以很容易地修复。 (如果交易有效,那就不应该发生。)