2013-02-04 64 views
0

將關鍵字添加到db。 我有3張桌子。如何避免爲多對多關係插入多個值 - mysql

Articles 
-ArticleID PK 
-ArticleTitle 
-ArticleBody 

Keywords 
-KeywordID PK 
-Keyword UNIQUE 

Keyword_Article 
-KeywordID PK 
-ArticleID 

試圖找出如何儘可能有效地更新關鍵字表。 我現在所擁有的只是SQLBUDDY。

我曾與

INSERT INTO Keywords (KeywordID, Keyword) 
VALUES (NULL,'test'); 
INSERT INTO Keyword_Article (KeywordID, ArticleID) 
VALUES ('LAST_INSERT_ID()','2222'); 

成功,但是當我遇到一個已經存在這顯然是行不通的關鍵字。 我猜需要一個if/else /然後還是有一些其他方式,這應該完成。 我已閱讀關於存儲過程,可以幫助停止第二個表填充,如果第一個失敗,但我似乎無法讓他們在SQLBUDDY工作。

例如。

BEGIN 
INSERT INTO Keywords (KeywordID, Keyword) 
VALUES (NULL,'test') 
INSERT INTO Keyword_Article (KeywordID, ArticleID) 
VALUES ('LAST_INSERT_ID()','2222'); 
COMMIT; 

保持給出錯誤。

做這種多重插入的最佳方法是什麼?

+1

INSERT IGNORE INTO?應該忽略重複。 – Matt

回答

1

你可以做這樣的事情:

INSERT IGNORE INTO Keywords (Keyword) 
VALUES ('test') 
INSERT INTO Keyword_Article (KeywordID, ArticleID) 
VALUES ((SELECT KeywordID FROM Keywords WHERE Keyword = 'test'),'2222'); 

這將嘗試插入一個新的關鍵字,但如果它已經存在,忽略它。第二個查詢將始終找到KeywordID,無論它是否是新的。

1

你可以這樣說:

-- Forces Keyword to be unique 
CREATE UNIQUE INDEX Keywords_ndx ON Keywords(Keyword); 

然後:

-- Inserts keyword into Keywords, failing silently if duplicated 
INSERT IGNORE INTO `Keywords` (`Keyword`) VALUES ('test'); 

-- Retrieves that keyword's ID, be it newly inserted or duplicated. 
INSERT IGNORE INTO Keyword_Article (KeywordID, ArticleID) 
    SELECT KeywordID, 2222 FROM Keywords WHERE Keyword='test'; 

Keyword_Article既有領域的主鍵。您只將KeywordID聲明爲PK,但這樣,您不能擁有兩個具有相同關鍵字的文章,這似乎很奇怪,並且可能導致不希望的行爲。

+0

這兩個答案的工作,但選擇你的,因爲額外的信息,這節省了我一些頭抓:) :) – chris

+0

對不起,必須改變選擇的答案因爲第二次看這個解決方案沒有爲我工作...仍然感謝額外的信息 – chris

+0

沒問題,別擔心。但是,什麼*額外的信息*? : - ? – LSerni