0

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が必要だと推測していますが、これを行う方法は他にありますか。最初のテーブルが失敗した場合に2番目のテーブルが読み込まれるのを防ぐのに役立つストアドプロシージャについて読んだことがありますが、SQLBUDDYでそれらを機能させることができないようです。

例えば。

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

エラーを出し続けます。

この種の複数挿入を行うための最良の方法は何ですか?

4

2 に答える 2

1

次のようなことができます。

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

新しいキーワードを挿入しようとしますが、既に存在する場合は無視します。2 番目のクエリは、それが新しいかどうかにかかわらず、常に KeywordID を見つけます。

于 2013-02-04T22:32:39.880 に答える
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 として宣言しましたが、そのようにすると、同じキーワードを持つ 2 つの記事を持つことができず、奇妙に見え、望ましくない動作につながる可能性があります。

于 2013-02-04T22:37:17.553 に答える