说明
我正在尝试将用户的首选项插入数据库。如果用户尚未放置任何内容,我需要insert
,否则,我想要update
。我知道我可以在创建用户时插入默认值,而不是专门使用update
,但这会添加另一个查询(我认为)
问题:
我已阅读ON DUPLICATE KEY UPDATE
,但我不明白。 This几乎是我的确切问题,但没有答案。答案是:
只要您拥有定义为UNIQUE KEY或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
答案 0 :(得分:4)
好吧,除非你希望你的应用程序仅供一个人使用,否则你必须在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';
我在SQL Fiddle中构建了一种demo。您可以更多地使用它来更好地理解这个概念。 )
答案 1 :(得分:1)
对于选项,您通常会有一个options
表,其中包含可用选项列表(如颜色,大小等),然后是一个跨越options
表和{{1}的表表格包含用户的值。
例如,您的users
表格:
options
您的id | name
=========
1 | color
2 | size
表格:
users
和id | name
================
1 | Martin Bean
联接表:
options_users
使用option_id | user_id | value
===========================
1 | 1 | Blue
2 | 1 | Large
表中设置的正确外键,可以在从系统中删除选项或用户时删除冗余值。此外,在保存用户的偏好设置时,您可以先删除之前的答案并插入新的答案。
options_users
希望有所帮助。