如何使用INSERT ... ON DUPLICATE?

时间:2014-07-07 17:24:59

标签: mysql sql insert-update

结构表:

CREATE TABLE IF NOT EXISTS `table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `rows_id` int(11) NOT NULL,
  `url_id` int(11) NOT NULL,
  `keyword_id` int(11) NOT NULL,
  `date` datetime NOT NULL,
  `seet` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;

STRUCTURE TABLE WITH TEST ROWS ON SQLFIDDLE

查询插入:

INSERT INTO `table` (`id`, `rows_id`, `url_id`, `keyword_id`, `date`, `seet`) 
VALUES
(1, 1, 2, 1, '2014-05-01 00:00:00', 1);

如果表格已经包含date =' 2014-05-01 00:00:00'的行,我想插入此行或更新行和rows_id =' 1'和keyword_id =' 1'。

dev.mysql.com中,我看到了INSERT ... ON DUPLICATE KEY UPDATE查询,但在我的情况下如何插入或更新?

2 个答案:

答案 0 :(得分:2)

INSERT ... ON DUPLICATE KEY UPDATE(IODKU)仅在您插入的值与基于PRIMARY KEY或UNIQUE KEY的现有行冲突时才进行更新。

因此,您需要在三列上定义UNIQUE KEY,否则IODKU无法判断该行是否与现有行冲突。

ALTER TABLE `table` ADD UNIQUE KEY (date, rows_id, keyword_id);

您在上面的评论中说过,您可以拥有多个具有相同rows_id的行。这没关系 - 唯一约束表明你不能有两行复制daterows_id keyword_id中三个值的相同组合。但是,只要三者的组合是唯一的,就可以在这些列中的任何一列中拥有多个具有相同值的行。

这是一个快速演示:

mysql> create table t (
    id int auto_increment primary key,
    d int,
    r int,
    k int, 
    unique key(d,r,k)
);

mysql> insert into t values (1,1,1,1);
Query OK, 1 row affected (0.01 sec)

mysql> insert into t values (1,1,1,1) on duplicate key update d = values(d)+1;
Query OK, 2 rows affected (0.00 sec)

mysql> select * from t;
+----+------+------+------+
| id | d    | r    | k    |
+----+------+------+------+
|  1 |    2 |    1 |    1 |
+----+------+------+------+

答案 1 :(得分:0)

从我对你的问题的理解,这可能会有所帮助。此SQL查询将测试是否存在行并根据该行是否已存在来更新行或创建新行。

IF EXISTS (SELECT * FROM table WHERE date = 2014-05-01 00:00:00 AND rows_id = 1 AND keyword_id = 1)
BEGIN
    UPDATE table SET Params=values
END
ELSE
BEGIN
    INSERT INTO `table` (`id`, `rows_id`, `url_id`, `keyword_id`, `date`, `seet`) VALUES (1, 1, 2, 1, '2014-05-01 00:00:00', 1)
END

如果该行存在(如果SELECT语句返回数据),则将运行UPDATE查询。如果该行不存在(SELECT语句不返回任何数据),则INSERT INTO语句将运行。