web*_*007 1 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 ;
Run Code Online (Sandbox Code Playgroud)
我想要做的是:
假设我想插入一个新条目,但我不希望它重复,谷歌周围,我发现这种格式:
INSERT INTO users_settings_temp(...)
ON DUPLICATE KEY UPDATE data = '{$data}'
Run Code Online (Sandbox Code Playgroud)
我猜问题出现在我的表中,主键=> id.如何更改表格,以便我可以使用:
INSERT INTO ... ON DUPLICATE KEY UPDATE
Run Code Online (Sandbox Code Playgroud)
我可以使用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 ;
Run Code Online (Sandbox Code Playgroud)
当你这样做的话
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)
Run Code Online (Sandbox Code Playgroud)
b)当然主键保证是唯一的
mysql> INSERT INTO users_settings_temp VALUES (1, 2, 'type2', 'keks', 5);
ERROR 1062 (23000): Duplicate entry '1-type2' for key 'PRIMARY'
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
但会永远增加它们
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)
Run Code Online (Sandbox Code Playgroud)
笔记:
您应该考虑是否id仍然应该自动增量.另外,想不出date_created应该int(11)代替的原因datetime
| 归档时间: |
|
| 查看次数: |
19917 次 |
| 最近记录: |