【问题标题】:Primary key as unique on duplicate key update主键在重复键更新时是唯一的
【发布时间】:2023-02-16 23:02:03
【问题描述】:

我有这个查询:

INSERT INTO table1 (user_id, item_id, stat, shipped) VALUES (17, 30, 1, 0)
ON DUPLICATE KEY UPDATE stat = 0;

我第一次运行它会添加一个新行。完美的。

第二次运行也是如此,尽管它应该将统计信息更新为 0。

我试图在 table1 表中将主键 (id) 设置为 UNIQUE,但没有成功。

有人对此有解决方案吗?

表格1

CREATE TABLE table1 (
  id int NOT NULL AUTO_INCREMENT,
  user_id int NOT NULL,
  item_id int NOT NULL,
  stat tinyint NOT NULL,
  shipped tinyint NOT NULL,
  PRIMARY KEY (id),
  FOREIGN KEY (user_id) REFERENCES accounts(id),
  FOREIGN KEY (item_id) REFERENCES items(id)
);

谢谢你!

【问题讨论】:

  • table1 的确切结构是什么?您应该将其 create 语句放在问题本身中。
  • 为什么您希望统计信息更新为 0?您在此处描述的内容没有定义为重复的内容。
  • 我更新了问题。我有一个按钮,如果你按下它,它会调用一个 php 文件,其中包含一个需要将其设置为 1 的查询,如果你再次按下它,则将其设置回 0 或删除该行
  • user_id 上的唯一键将使这项工作有效。
  • 这是否意味着如果我将 user_id 设置为唯一,我只能在该列中拥有该用户一次?我希望用户拥有超过 1 个项目。

标签: mysql sql


【解决方案1】:

如果 user_iditem_id 的组合使记录唯一,如果表已经存在,请运行此查询:

ALTER TABLE `table1` ADD UNIQUE `unique_index`(`user_id`, `item_id`);

【讨论】:

    【解决方案2】:

    这没有按预期工作的原因是因为“ON DUPLICATE KEY”总是引用主索引或唯一索引。

    如果您在语句中包含了 id,那么它会起作用,因为主键是 id(主键始终是唯一的)。

    如果您希望它在 user_id 和/或 item_id 上工作,您还将相应地添加唯一索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-12
      • 1970-01-01
      • 2013-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      • 2011-06-26
      相关资源
      最近更新 更多