2013-06-25 120 views
1

如果matchid和videoset字段等於當前值,我將如何插入一行或更新一行? 這就是我迄今爲止的內容,我期望如果我在空表上運行這兩次,結果的3行應該是返回的總量。當我運行這個查詢兩次,它不會更新像以前一樣添加的3個記錄,查詢將簡單地添加另外3個結果。任何有關這方面的知識將受到高度讚賞。謝謝!INSERT ON DUPLICATE KEY

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

您對數據庫中的字段有任何限制嗎? – wazy

+0

你能告訴我們表格模式和主鍵嗎? – KaeL

+0

使用表架構和主鍵編輯 –

回答

0

Justin在您的INSERT聲明中出現錯誤。從您的表格的列信息中,您已經說過:

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值,例如1,該ON DUPLICATE KEY UPDATE會工作。

檢查我的SQL Fiddle Demo,SELECT * FROM videos只返回1行按預期。

EDIT 1

我忘了videoidAUTO_INCREMENT。檢查我更新的SQL Fiddle Demo

由於這種情況,因此您不需要在INSERT聲明中包含videoid

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記錄上面。

EDIT 2

既然你曾經說過,沒有行應該有相同的matchidvideoset,我能想到的是使用COMPOSITE PRIMARY KEY的最佳方式,它只是谷歌了。不幸的是,我不知道如果SQL小提琴允許它。但是,這裏有一個例子:

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。這樣,當您即將到達INSERTmatchidvideoset的記錄已經存在時,則它會在ON DUPLICATE KEY UPDATE之後執行該記錄。

+0

感謝您的建議KaeL :)我將這個值留給videoid的原因是因爲它是一個自動增量鍵。如果我要在內部放置一個INT,是否會干擾自動增量過程?沒有必要指定videoid,沒有辦法解決這個問題嗎? –

+0

再次檢查我的答案@JustinHarris – KaeL

+0

因此無法檢查並查看錶格中是否有重複項目(matchid和videoset)並更新它們? –

相關問題