描述:
我正在尝试将用户的首选项插入到数据库中。如果用户还没有放置任何东西,我想要一个insert
,否则,我想要一个update
。我知道我可以在创建用户时插入默认值,而不是专门使用 update
,但这会添加另一个查询(我认为)
问题:
我已经阅读了 ON DUPLICATE KEY UPDATE
但我不明白。 This几乎是我的确切问题,但没有答案。答案是:
It does sound like it will work for what you want to do as long as you hav the proper column(s) defined as UNIQUE KEY or PRIMARY KEY.
如果我像这样做一个简单的insert
:
INSERT INTO table (color, size) VALUES ('blue', '18') ...
DUPLICATE KEY
将如何产生?据 mysql
所知,它只是另一个插入,id
是自动递增的。我将表中的主键设置为唯一,但 insert
不会检查它,对吗?
表格:
CREATE TABLE `firm_pref` (
`id` int(9) NOT NULL AUTO_INCREMENT,
`firm_id` int(9) NOT NULL, //user_id in this case
`header_title` varchar(99) NOT NULL,
`statement` varchar(99) NOT NULL,
`footer_content` varchar(99) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1
最佳答案
好吧,除非您希望您的应用程序仅供一个人使用,否则您必须在 INSERT
中指定某人的 user_id - 当这个“某人”的男孩或女孩更新他/她的偏好时, 正确的?
此字段 (user_id
) 正是 ON DUPLICATE KEY UPDATE
子句要检查的内容。
如果您想插入一条新记录,只需发送 NULL
即可:
INSERT INTO table (user_id, color, size) VALUES (NULL, 'blue', 18);
...所以自动增量将有机会继续前进并挽救这一天。 )
更新:请注意,要了解某些字段应被视为唯一 标识符,您应该将其标记为这样。通常它是自然完成的,因为此字段用作 PRIMARY KEY
。但有时这还不够;这意味着一些 UNIQUE
约束的工作。例如,在你的表中它可以这样使用:
CREATE TABLE `prefs` (
`id` int(9) NOT NULL AUTO_INCREMENT,
`firm_id` int(9) NOT NULL,
...
PRIMARY KEY (`id`),
UNIQUE KEY (`firm_id`)
);
(或者您可以使用 ALTER TABLE prefs ADD UNIQUE (firm_id)
命令将此约束添加到现有表中)
然后插入/更新查询看起来像...
INSERT INTO prefs(firm_id, header_title, statement, footer_content)
VALUES(17, 'blue', '18', 'some_footer')
ON DUPLICATE KEY UPDATE
header_title = 'blue',
statement = '18',
footer_content = 'some_footer';
我构建了一种 demo在 SQL fiddle 中。您可以多玩几次以更好地理解该概念。 )
关于mysql - ON DUPLICATE KEY 查询中的重复项在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12373227/