mysql 主键在重复键更新时为唯一[已关闭]

mefy6pfw  于 2023-02-28  发布在  Mysql
关注(0)|答案(2)|浏览(139)

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
11天前关闭。
Improve this question
我有这样的疑问:

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

我第一次运行这个程序时它会添加一个新行。完美。
第二次运行也是如此,尽管它应该将统计更新为0。
我尝试在table1表中将主键(id)设置为UNIQUE,但没有成功。
有人能解决这个问题吗?
表一

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

谢谢大家!

irtuqstp

irtuqstp1#

如果user_iditem_id的组合使记录唯一,则在表已经存在的情况下运行以下查询:

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

wljmcqd82#

数据库表需要知道您所关心的唯一性。如果您在表中设置了唯一索引,并尝试添加具有相同值的行,则会抛出错误,因为表不允许多行具有相同值。当发生这种情况时,语句的“ON DUPLICATE KEY”部分将启动。
之所以不能按预期工作,是因为“ON DUPLICATE KEY”始终引用主索引或唯一索引。
如果你在你的语句中包含了id,那么它就像主键是id一样工作(主键总是唯一的)。
如果你想让它在user_id和/或item_id上工作,你也要相应地添加唯一索引。
不要忘记,如果唯一性是多个列的组合,则需要添加一个唯一的复合索引。

相关问题