结构表:
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
查询,但在我的情况下如何插入或更新?
答案 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
的行。这没关系 - 唯一约束表明你不能有两行复制date
,rows_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语句将运行。