使用 INSERT INTO ... ON DUPLICATE KEY UPDATE 时的 Mysql 主键

标签 mysql primary-key insert-update database-table

我的表结构是:

CREATE TABLE IF NOT EXISTS `users_settings_temp` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `userid` int(10) unsigned DEFAULT NULL,
  `type` enum('type1','type2')
  `data` text,
  `date_created` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

我想做的是:

假设我想插入一个新条目,但我不希望它重复,在 google 之后,我发现了这种格式:

INSERT INTO users_settings_temp(...)
ON DUPLICATE KEY UPDATE data = '{$data}'

我猜问题出在我的表上,主键=> id。我如何更改表格,以便我可以使用:

INSERT INTO ... ON DUPLICATE KEY UPDATE

我可以使用 user_id + type 作为主键吗?如果是,你能告诉我怎么做吗?

最佳答案

CREATE TABLE IF NOT EXISTS `users_settings_temp` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `userid` int(10) unsigned DEFAULT NULL,
  `type` enum('type1','type2'),
  `data` text,
  `date_created` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`, `type`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

当你这样做的时候

a) 指定 id 有效

mysql> INSERT INTO users_settings_temp VALUES (1, 2, 'type1', 'keks', 5);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO users_settings_temp VALUES (1, 2, 'type2', 'keks', 5);
Query OK, 1 row affected (0.00 sec)

b) 当然主键保证是唯一的

mysql> INSERT INTO users_settings_temp VALUES (1, 2, 'type2', 'keks', 5);
ERROR 1062 (23000): Duplicate entry '1-type2' for key 'PRIMARY'

c) 让数据库提取一个新的 id 是可行的

mysql> INSERT INTO users_settings_temp VALUES (NULL, 2, 'type2', 'keks', 5);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO users_settings_temp VALUES (NULL, 2, 'type1', 'keks', 5);
Query OK, 1 row affected (0.00 sec)

但会一直增加它们

mysql> SELECT * FROM users_settings_temp;
+----+--------+-------+------+--------------+
| id | userid | type  | data | date_created |
+----+--------+-------+------+--------------+
|  1 |      2 | type1 | keks |            5 |
|  1 |      2 | type2 | keks |            5 |
|  2 |      2 | type2 | keks |            5 |
|  3 |      2 | type1 | keks |            5 |
+----+--------+-------+------+--------------+
4 rows in set (0.00 sec)

注意事项:

您应该考虑您的 id 是否仍应自动递增。 另外,想不出为什么 date_created 应该是 int(11) 而不是 datetime

关于使用 INSERT INTO ... ON DUPLICATE KEY UPDATE 时的 Mysql 主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4343821/

相关文章:

ruby-on-rails - 为什么 Rails 5 将 "index"更改为 "foreign key"?

javascript - 如何将数据添加到 mongodb 中已有的项目

php - Mysql自动插入新表

database-design - 我应该有专门的主键字段吗?

SQL:主键列。人工 "Id"列与 "Natural"列

java - hibernate:插入/更新时的自定义代码

c++ - 如何二进制搜索结构 vector 并插入适当的索引

mysql - 将 Excel 行转换为 SQL 列

python - 使用 Python 将 MySQL 表中的数据保存到文本文件

mysql - 将子查询结果添加到查询中