首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在为多对多关系插入多个值时避免重复- mysql

如何在为多对多关系插入多个值时避免重复- mysql
EN

Stack Overflow用户
提问于 2013-02-05 06:24:27
回答 2查看 114关注 0票数 0

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

代码语言:javascript
复制
Articles
-ArticleID PK
-ArticleTitle
-ArticleBody

Keywords
-KeywordID PK
-Keyword UNIQUE

Keyword_Article
-KeywordID PK
-ArticleID

试图弄清楚如何尽可能高效地更新关键字表。我现在只有SQLBUDDY可以使用。

代码语言:javascript
复制
INSERT INTO Keywords (KeywordID, Keyword)
VALUES (NULL,'test');
INSERT INTO Keyword_Article (KeywordID, ArticleID)
VALUES ('LAST_INSERT_ID()','2222');

但是当我遇到一个已经存在的关键字时,这显然不起作用。我猜需要一个if/else/then,或者是否有其他方法可以做到这一点。我读过有关存储过程的文章,如果第一个表失败,存储过程可以帮助阻止第二个表的填充,但我似乎无法让它们在SQLBUDDY中工作。

例如:

代码语言:javascript
复制
BEGIN
INSERT INTO Keywords (KeywordID, Keyword)
VALUES (NULL,'test')
INSERT INTO Keyword_Article (KeywordID, ArticleID)
VALUES ('LAST_INSERT_ID()','2222');
COMMIT;

做这种多重插入的最好方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-05 06:32:40

你可以这样做:

代码语言:javascript
复制
INSERT IGNORE INTO Keywords (Keyword)
VALUES ('test')
INSERT INTO Keyword_Article (KeywordID, ArticleID)
VALUES ((SELECT KeywordID FROM Keywords WHERE Keyword = 'test'),'2222');

这将尝试插入一个新关键字,但如果该关键字已经存在,则将其忽略。第二个查询将始终找到KeywordID,无论它是新的还是不新的。

票数 1
EN

Stack Overflow用户

发布于 2013-02-05 06:37:18

你可以这样做:

代码语言:javascript
复制
-- Forces Keyword to be unique
CREATE UNIQUE INDEX Keywords_ndx ON Keywords(Keyword);

然后:

代码语言:javascript
复制
-- 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,但这样,您就不能有两篇具有相同关键字的文章,这看起来很奇怪,可能会导致不受欢迎的行为。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14696857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档