grigor007
@grigor007
http://goldapp.ru

Как сделать on duplicate key "для нескольких ключей"?

Здравствуйте,

CREATE TABLE `user_notification` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `user_id` int(10) unsigned NOT NULL,
  `article_id` int(10) unsigned default NULL,
  `magazine_id` int(10) unsigned default NULL,
  `user_page_id` int(10) unsigned default NULL,
  `date_time` datetime NOT NULL,
  `unix_date` int(10) unsigned NOT NULL,
  `comment_id` int(10) unsigned NOT NULL,
  `is_subscribed` enum('1','0') collate utf8_unicode_ci NOT NULL,
  `status` enum('send','not_send') collate utf8_unicode_ci NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `user_id` (`user_id`,`article_id`,`magazine_id`,`user_page_id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;



Как мне сделать чтобы update был только если попадаются одинаковые значения в колонках: `user_id`,`article_id`,`magazine_id`,`user_page_id`


например уже есть эти поля со значениями:


1, 2, NULL, NULL


и я делаю

INSERT INTO `user_notification`
	(`user_id`,`article_id`,`magazine_id`,`user_page_id`,`date_time`,`unix_date`,`comment_id`,`is_subscribed`,`status`)
	values 
	(1,2,NULL,NULL,NOW(),UNIX_TIMESTAMP(),3,'1','not_send') 
	ON DUPLICATE KEY UPDATE
	`date_time` = NOW()
	, unix_date = UNIX_TIMESTAMP()
	, comment_id = 4



и выполнится в запросе должна ветка update


а если хотя бы в одном из этих полей есть различия, то выполнился бы insert…
  • Вопрос задан
  • 8225 просмотров
Пригласить эксперта
Ответы на вопрос 4
sdevalex
@sdevalex
Создайте уникальный индекс для 4 полей…
alter table user_notification add unique index(`user_id`,`article_id`,`magazine_id`,`user_page_id`);
Ответ написан
ivnik
@ivnik
Насколько я знаю ON DUPLICATE KEY UPDATE работает только с PRIMARY KEY. Т.е. чтобы использовать эту возможность вам придётся все эти поля занести в PK.
Ответ написан
grigor007
@grigor007 Автор вопроса
http://goldapp.ru
ужас, всё поехало.., извиняюсь…
Ответ написан
Комментировать
ivnik
@ivnik
Нужно из PK удалить поле id, т.е. чтобы ON DUPLICATE KEY UPDATE сработал должен произойти конфликт PK.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы