【问题标题】:mySQL UPDATE while ignoring table constraintsmySQL UPDATE 同时忽略表约束
【发布时间】:2014-11-21 10:55:23
【问题描述】:

我需要更新 mySQL 数据库中的一行,但在存在约束时无法执行此操作。

约束要求两列的组合是唯一的。

例如,名字和姓氏字段需要是唯一的。 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 仍然不能解决我的问题,我仍然得到错误。

有没有办法在执行此操作时忽略唯一键,而无需像滑动拼图一样更改周围的数据?

【问题讨论】:

标签: mysql sql-update unique-key


【解决方案1】:

如果您想交换“Bob Smith”和“Jim Smith”,您可以通过三个更新来实现:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-04
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    相关资源
    最近更新 更多