2

描述:

我正在尝试将用户的首选项插入数据库。如果用户还没有放置任何东西,我想要一个insert,否则,我想要一个update. 我知道我可以在创建用户时插入默认值,而不是专门使用update,但这增加了另一个查询(我认为)

问题:

我已经阅读了,ON DUPLICATE KEY UPDATE但我不明白。几乎是我的确切问题,但没有答案。答案说:

只要您将正确的列定义为 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
4

2 回答 2

4

好吧,除非您希望您的应用程序仅由一个人使用,否则您必须在其中指定某人的 user_id INSERT- 当这个“某人”男孩或女孩更新他/她的偏好时,对吗?

该字段 ( 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 中构建了一个演示。你可以多玩一些来更好地理解这个概念。)

于 2012-09-11T15:40:51.773 回答
1

对于选项,您通常会有一个options包含可用选项列表(如颜色、大小等)的表格,然后是一个包含用户值的表格,该表格跨越您的options表格和表格。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,您可以在从系统中删除选项或用户时删除冗余值。此外,当保存用户的偏好时,您可以先删除他们以前的答案并插入新的答案。

DELETE FROM `options_users`
WHERE `user_id` = @user_id;

INSERT INTO `options_users` (`option_id`, `user_id`, `value`)
VALUES (1, @user_id, 'Blue'), (2, @user_id, 'Large');

希望有帮助。

于 2012-09-11T15:42:58.453 回答