1

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

1 回答 1

0

INSERT你的陈述贾斯汀会有一个错误。从表的列信息中,您说过:

PRIMARY KEYisvideoid和 is 的数据类型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

既然是这种情况,您不需要videoidINSERT语句中包含。

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);

但请注意,所有三个记录都将插入到表中,因为videoidis AUTO_INCREMENT,上面不会有DUPLICATE记录。

编辑 2

既然你说没有行应该有相同的matchidand 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);

如您所见,我将matchidand设置videosetPRIMARY KEY. 这样,当您要使用并且已经存在INSERT的记录时,它将执行.matchidvideosetON DUPLICATE KEY UPDATE

于 2013-06-25T02:47:19.147 回答