Mysql первичный ключ при использовании INSERT INTO ... ON DUPLICATE KEY UPDATE - PullRequest
1 голос
/ 03 декабря 2010

Моя структура таблицы:

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 в качестве первичного ключа? Если да, не могли бы вы показать мне, как это сделать?

1 Ответ

5 голосов
/ 03 декабря 2010
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) задание идентификатора работает

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'

в) разрешение для базы данных извлекать новый идентификатор работает

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

...