目前的表格如下:
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”值,我该如何确保不插入重复值?< / p>
我目前正在使用
$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));
我想知道是否有更好的方法?
答案 0 :(得分:4)
向这两列添加UNIQUE
约束。
答案 1 :(得分:4)
ALTER TABLE `feed_items` ADD UNIQUE INDEX `constraint` (`link`, `remote_id`);
答案 2 :(得分:1)
您可以使用ON DUPLICATE来避免此类情况:检查:http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
希望有所帮助
答案 3 :(得分:0)
试试这个:
$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));
只是为了澄清 - 这个解决方案将插入更改为... values语句,插入到... select语句,附加了一个not exists()子句。如果找到与已存在的记录匹配的记录,则此not exists子句将阻止insert执行任何操作。如果存在预先存在的记录,则不会抛出错误。
答案 4 :(得分:0)
感谢您的回复!
我实际上设法在发布后几个小时解决了它,我使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