0

現在、自動インクリメントID番号、名前、および定義を含むテーブルがあり、次を使用して別のテーブルの値でテーブルを更新しています

INSERT INTO words(id, word, definition) SELECT id, word, definition FROM temp 
ON DUPLICATE KEY UPDATE words.word = temp.word, words.definition=temp.definition;

テーブル一時には、使用しているテーブルとまったく同じ列レイアウトがあり、一時の途中からエントリを削除してからメインテーブルを更新する場合を除いて、正常に機能します。例えば、

temp
id  word definition
1   bob   is a cat
2   sam   is a dog
3   doug  is a monk
4   croe  is a bird

テーブルのメインはそれに設定されています次に、tempから行2を削除します

temp
    id  word definition
    1   bob   is a cat
    2   doug  is a monk
    3   croe  is a bird

次に、メインテーブルを更新します

main
id  word definition
1   bob   is a cat
2   sam   is a dog
3   croe  is a bird
4   croe  is a bird

temp には現在 3 行しかありませんが、main HAD は 4 であるため、4 行目は削除されません。word を一意の列にすることでこれを修正しようとしましたが、キー「word」のエントリが重複しているというエラーが表示されます。では、どうすればこれを修正できますか?

4

1 に答える 1

0

MySQLマニュアルから、

一般に、複数の一意のインデックスを持つテーブルでON DUPLICATEKEYUPDATE句を使用しないようにする必要があります。

したがって、できることはword、主キーを作成し、id列を削除することです。それはトリックを行う必要があります:)

クエリは次のようになります

INSERT INTO words(word, definition) SELECT word, definition FROM temp 
ON DUPLICATE KEY UPDATE words.word = temp.word, words.definition=temp.definition;

任意の並べ替えが必要な場合は、追加のテーブルを作成します

CREATE TABLE word_order (VARCHAR(30) PRIMARY KEY, sort_order INT)

クエリを実行すると

SELECT words.word,
       words.definition
FROM words
JOIN word_order
ON words.word = word_order.word
ORDER BY word_order.sort_order

INSERTSただし、もう少し複雑になりますが、複数の挿入を実行する必要があります。sql-1つのクエリで複数のテーブルに挿入するを参照してください。

また、このCodeProjectの記事には、このトピックに関するいくつかのアイデアがあります。

于 2012-12-09T23:48:08.637 に答える