Нужно вставить SQL без дубликатов - PullRequest
2 голосов
/ 22 ноября 2011

Таблица на данный момент такая:

CREATE TABLE `feed_items` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `feed_id` int(11) NOT NULL,
  `remote_id` varchar(32) NOT NULL DEFAULT '',
  `title` varchar(255) NOT NULL DEFAULT '',
  `link` varchar(255) NOT NULL DEFAULT '',
  `updated_time` datetime NOT NULL,
  `created_time` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Мне нужно найти способ, чтобы, если я вытащил несколько RSS-каналов в одну таблицу, а статьи с одинаковым заголовком имели одинаковое значение 'remote_id', как я могу убедиться, что не вставляю дублирующее значение?

Я сейчас использую

$this->db->query('INSERT INTO feed_items(feed_id, remote_id, link, title, created_time, updated_time) VALUES (?, ?, ?, ?, ?, NOW()) ON DUPLICATE KEY UPDATE remote_id=remote_id', array($this->feed_id, $this->remote_id, $this->link, $this->title, $this->created_time, $this->remote_id));

Мне было интересно, есть ли лучший способ?

Ответы [ 5 ]

4 голосов
/ 22 ноября 2011
ALTER TABLE `feed_items` ADD UNIQUE INDEX `constraint` (`link`, `remote_id`);
4 голосов
/ 22 ноября 2011

Добавьте ограничение UNIQUE к этим двум столбцам.

1 голос
/ 22 ноября 2011

Вы можете использовать ON DUPLICATE, чтобы избежать таких условий: Проверьте: http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

Надеюсь, это поможет

0 голосов
/ 23 ноября 2011

Спасибо за ответы!

Мне действительно удалось решить эту проблему через несколько часов после публикации, я сделал remote_id уникальным столбцом и затем сделал следующее для SQL

INSERT INTO feed_items(feed_id, remote_id, link, title, created_time, updated_time) VALUES (?, ?, ?, ?, ?, NOW()) ON DUPLICATE KEY UPDATE remote_id=remote_id
0 голосов
/ 22 ноября 2011

Попробуйте это:

$this->db->query('INSERT INTO feed_items(feed_id, remote_id, link, title, created_time, updated_time) SELECT ?, ?, ?, ?, ?, NOW() WHERE not exists(SELECT 1 FROM feed_items f2 WHERE f2.title = ? and f2.remote_id = ?)', array($this->feed_id, $this->remote_id, $this->link, $this->title, $this->created_time, $this->title, $this->remote_id));

Просто чтобы уточнить - это решение заменяет оператор вставки в ... значения на оператор вставки в ... выбор с присоединенным предложением not there ()Это предложение не существует будет препятствовать вставке делать что-либо, если она находит запись, которая соответствует той, которая уже присутствует.Он не выдаст ошибку, если уже существует существующая запись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...