mySQL UPDATE同时忽略表约束

时间:2014-11-21 10:55:24

标签: mysql sql-update unique-key

我需要更新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仍然无法解决我的问题而且我仍然会收到错误。

有没有办法忽略唯一键,同时执行此操作而不像滑动拼图那样更改数据?

1 个答案:

答案 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';

我建议将它们包装在一个事务中,以便它们在逻辑上作为单个块执行,并将其放入存储过程中。

另一种方法是删除或禁用对表的检查。这会产生影响 - 在多用户环境中,其他线程可能会出错。或者,系统可能会关闭并重新启动检查。

这种方法可能发生的最坏情况是记录得到一个非常尴尬的名字,可以很容易地修复。 (如果交易有效,那就不应该发生。)