mysql - ON DUPLICATE KEY 查询中的重复项在哪里?

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

描述:

我正在尝试将用户的首选项插入到数据库中。如果用户还没有放置任何东西,我想要一个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/

相关文章:

mysql - 将数据插入 MySQL 数据库,指定特定的表

php - 一个脚本中包含大量 SELECT 和 INSERTS

php - Zend Framework 选择对象和 UNION()

Mysql加减查询

php - 如何使用REPLACE函数替换mysql中的特殊字符

sql - 将具有特定值的列更新为具有相同 id 的列值

php - 可以为用户 php 创建组

php - 查找逗号分隔的关键字列表

sql-server - TSQL while 循环

sql - 插入条件常量