ON DUPLICATE KEY查询中的副本在哪里?

时间:2012-09-11 15:32:18

标签: mysql sql-update sql-insert on-duplicate-key

说明

我正在尝试将用户的首选项插入数据库。如果用户尚未放置任何内容,我需要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

2 个答案:

答案 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

希望有所帮助。