如果matchid和videoset字段等于当前值,我将如何插入行或更新行? 这就是我到目前为止所做的事情,如果我在空表上运行两次,我会期待,3行结果应该是返回的总量。当我运行此查询两次时,它不会像预期的那样更新之前添加的3条记录,查询将只添加另外3条结果。任何有关该领域的知识都将受到高度赞赏。谢谢!
INSERT INTO videos (matchid, youtubecode, videoid, videoset) VALUES
(96, "Blahblahblah", '', '1'),
(96, "WEEEEEE", '', '2'),
(96, "glgkgklbgjbgklbj", '', '3')
on duplicate key update matchid=values(videoset) AND videoset=values(videoset)
/*Column Information*/
----------------------
Field Type Collation Null Key Default Extra Privileges Comment
----------- ------------ ----------------- ------ ------ ------- -------------- ------------------------------- ---------
matchid int(10) (NULL) YES MUL (NULL) select,insert,update,references
youtubecode varchar(300) latin1_swedish_ci NO (NULL) select,insert,update,references
videoid int(11) (NULL) NO PRI (NULL) auto_increment select,insert,update,references
videoset int(11) (NULL) YES MUL (NULL) select,insert,update,references
/*Index Information*/
---------------------
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
------ ---------- -------- ------------ ----------- --------- ----------- -------- ------ ------ ---------- ------- ---------------
videos 0 PRIMARY 1 videoid A 6 (NULL) (NULL) BTREE
videos 1 matchid 1 matchid A 2 (NULL) (NULL) YES BTREE
videos 1 videoset 1 videoset A 6 (NULL) (NULL) YES BTREE
答案 0 :(得分:0)
您的INSERT
声明Justin会出错。从表中的列信息中,您已经说过:
PRIMARY KEY
为videoid
,数据类型为INTEGER
。
但是,在您的INSERT
声明中,您要在''
列中插入videoid
。
INSERT INTO videos (matchid, youtubecode, videoid, videoset) VALUES
(96, "Blahblahblah", '', '1'),
^ video id
(96, "WEEEEEE", '', '2'),
^ video id
(96, "glgkgklbgjbgklbj", '', '3')
^ video id
ON DUPLICATE KEY UPDATE matchid = values(videoset) AND videoset = values(videoset)
尝试将''
更改为有效的INTEGER
值,例如1
,ON DUPLICATE KEY UPDATE
将有效。
检查我的SQL Fiddle Demo,SELECT * FROM videos
只按预期返回1行。
编辑1
我忘了videoid
是AUTO_INCREMENT
。查看我更新的SQL Fiddle Demo。
既然如此,您就不需要在videoid
声明中加入INSERT
。
INSERT INTO videos (matchid, youtubecode, videoset) VALUES
(96, "Blahblahblah", '1'),
(96, "WEEEEEE", '2'),
(96, "glgkgklbgjbgklbj", '3')
on duplicate key update matchid=values(videoset) AND videoset=values(videoset);
但请注意,由于videoid
为AUTO_INCREMENT
,所有三条记录都将插入表格中,上面不会有DUPLICATE
条记录。
编辑2
由于您已经说过没有行应该具有相同的matchid
和videoset
,因此我能想到的最佳方式是使用COMPOSITE PRIMARY KEY
,只需谷歌即可。不幸的是,我不知道 SQL Fiddle 是否允许它。但这是一个例子:
CREATE TABLE videos (
matchid INT(10),
youtubecode VARCHAR(300),
videoid INT(11) NOT NULL AUTO_INCREMENT,
videoset INT(11),
PRIMARY KEY (matchid, videoset)
);
或
ALTER TABLE videos ADD PRIMARY KEY(matchid, videoset);
如果已经定义了PRIMARY KEY
,则只需删除它
ALTER TABLE videos DROP PRIMARY KEY, ADD PRIMARY KEY(matchid, videoset);
如您所见,我将matchid
和videoset
设为PRIMARY KEY
。这样,当您即将INSERT
已存在matchid
和videoset
的记录时,它将在ON DUPLICATE KEY UPDATE
之后执行该语句。