2010-12-03 4 views
1

Моя структура таблицы:Mysql первичного ключа при использовании INSERT INTO ... дублированием KEY UPDATE

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

+0

Что именно вы хотите, чтобы произошло на двух экземплярах? Выбрось это? Измените данные на что-то? – 2010-12-03 08:53:39

+0

Извините, что не указано. Я хочу обновить его дубликат. Я скоро обновлю свой вопрос. – 2010-12-03 08:55:03

ответ

5
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 ; 

Когда вы делаете это так, то

а) с указанием идентификатор работы

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) 

б) конечно первичный ключ гарантированно будет уникальным

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

с) позволяя базе данных тянуть новые работы 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 еще должен быть Autoincrement или нет. Кроме того, не может думать о причине, почему date_created должен быть int(11) вместо datetime

Смежные вопросы