【问题标题】:ON DUPLICATE KEY UPDATE only for primary keys?ON DUPLICATE KEY UPDATE 仅适用于主键?
【发布时间】:2018-07-02 23:05:45
【问题描述】:

有没有办法限制“ON DUPLICAYE KEY UPDATE”仅在重复键是表的 PRIMARY KEY 时触发? (如果冲突是由 UNIQUE KEY 生成的,则不会)

例如下表:

CREATE TABLE users (
    id INT(16) UNSIGNED AUTO_INCREMENT,
    username VARCHAR(255) NOT NULL UNIQUE,
    PRIMARY KEY (id),
    UNIQUE (username)
);

我只想在id 列产生冲突时触发更新,并像往常一样抛出错误,以防由于唯一键username 而发生冲突。

编辑

我正在开发一个非常简单的 PHP 框架。以前我有一个方法save(),它根据调用它的对象上是否存在id 属性来区分INSERTUPDATE

现在我使用 INSERT INTO ... ON DUPLICATE KEY UPDATE 查询重写了这个方法,但是当我尝试插入(例如)具有已经存在的 username 值的用户时,它会更新该用户而不是引发错误。

我知道这是正确的行为,我只是想知道是否有办法仅在 PRIMARY KEY 上实现相同的结果。

【问题讨论】:

  • 我假设应该读过UNIQUE(username)?
  • @Uueerdo 是的,抱歉,我更新了问题

标签: mysql sql sql-update primary-key unique-key


【解决方案1】:

on duplicate key 触发主键和唯一键。

在你的情况下,主键是一个自动递增的列,所以你不应该插入一个值。期间。

因此,您可以通过简单地不包括 on duplicate key 子句并从 insert 中省略 id 来获得所需的行为。

【讨论】:

  • 我解释得不够充分。我已经更新了问题,但您的答案似乎很清楚“主键和唯一键的触发器”
  • @Sneppy 。 . .我要强调的是,您不应该将id 传递给insert,因为数据库会自动设置它。
  • 实际上我从未说过我在插入查询中也提供了id
  • @Sneppy 如果你没有指定 id,它不应该产生冲突。
  • @Uueerdo 是的,它会在 username 列上产生冲突,从而更新该行。无论如何,那张桌子只是一个例子。我一直在寻找更通用的解决方案,这就是我想区分主键和唯一键的方式。
猜你喜欢
  • 2017-04-14
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
  • 1970-01-01
  • 2014-06-23
相关资源
最近更新 更多