- 已关闭。**此问题需要debugging details。当前不接受答案。
编辑问题以包含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)
);
谢谢大家!
2条答案
按热度按时间irtuqstp1#
如果
user_id
和item_id
的组合使记录唯一,则在表已经存在的情况下运行以下查询:wljmcqd82#
数据库表需要知道您所关心的唯一性。如果您在表中设置了唯一索引,并尝试添加具有相同值的行,则会抛出错误,因为表不允许多行具有相同值。当发生这种情况时,语句的“ON DUPLICATE KEY”部分将启动。
之所以不能按预期工作,是因为“ON DUPLICATE KEY”始终引用主索引或唯一索引。
如果你在你的语句中包含了id,那么它就像主键是id一样工作(主键总是唯一的)。
如果你想让它在user_id和/或item_id上工作,你也要相应地添加唯一索引。
不要忘记,如果唯一性是多个列的组合,则需要添加一个唯一的复合索引。