如何在为多对多关系插入多个值时绕过重复项 - mysql

时间:2013-02-04 22:24:27

标签: mysql sql database

向db添加关键字。 我有3张桌子。

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 / then或者还有其他方法可以做到这一点。 我已经阅读了有关存储过程的信息,这些存储过程可以帮助阻止第二个表填充,如果第一个表失败但我似乎无法让它们在SQLBUDDY中工作。

例如

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

不断出错。

进行这种多重插入的最佳方法是什么?

2 个答案:

答案 0 :(得分: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 :(得分: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,但是这样,您不能有两篇具有相同关键字的文章,这看起来很奇怪,可能会导致不良行为。