插入重复键

时间:2013-06-25 02:19:01

标签: mysql

如果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 

1 个答案:

答案 0 :(得分:0)

您的INSERT声明Justin会出错。从表中的列信息中,您已经说过:

PRIMARY KEYvideoid,数据类型为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值,例如1ON DUPLICATE KEY UPDATE将有效。

检查我的SQL Fiddle DemoSELECT * FROM videos只按预期返回1行。

编辑1

我忘了videoidAUTO_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);

但请注意,由于videoidAUTO_INCREMENT,所有三条记录都将插入表格中,上面不会有DUPLICATE条记录。

编辑2

由于您已经说过没有行应该具有相同的matchidvideoset,因此我能想到的最佳方式是使用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);

如您所见,我将matchidvideoset设为PRIMARY KEY。这样,当您即将INSERT已存在matchidvideoset的记录时,它将在ON DUPLICATE KEY UPDATE之后执行该语句。

相关问题