1

この質問は何度も尋ねられ、答えられましたが、私はまだ困惑しています。値が列にまだ存在しない場合は、挿入ステートメントを実行するだけです。この列の値は主キーを構成しないため、replaceまたはupdateアプローチは機能しないことに注意してください。

word_id (PK, auto-complete) | word | timestamp (autocomplete)
1--sinecure--25th March
2--demotic--3rd April
3--atavism--5th May

このテーブルに別の単語を追加する前に、まずそれがまだ存在していないことを確認したいと思います。このことを念頭に置いて、この例ではテーブルを変更しないでおく必要があります。

INSERT INTO word_table(word) VALUES "sinecure"
WHERE NOT EXISTS (SELECT word FROM word_table WHERE word LIKE "sinecure")

もちろん、このクエリの後、テーブルは変更されませんが、エラーがスローされるためです。これは私が試した唯一の構文ではありませんが、私が見たさまざまなフォーラム/チュートリアルで最も頻繁に提唱されている構文です。また、EXISTSステートメントによって生成されたbool値を格納するために変数を使用するなど、さまざまなハックを試しましたが、役に立ちませんでした。

4

3 に答える 3

2

私の記憶が正しければ、更新したいテーブルに対してネストされたクエリを実行することはできません。できることは、選択を実行することです。結果が得られない場合は、データを挿入します。

それ以外の場合は、列に既にインデックスがある可能性がありwordます。そのインデックスを一意にすると、単語が既に存在する場合にDBがエラーを返すため、問題は解決されます。この単語は主キーにはなりませんが、実際には代替 (一意) キーです。

于 2012-09-03T21:11:14.340 に答える
2

これを使用できます:

INSERT INTO word_table (word) 
SELECT 'sinecure'
FROM dual
WHERE NOT EXISTS (SELECT word FROM word_table WHERE word LIKE 'sinecure') ;

その動作が時々ではなく常に必要な場合は、word他の人がアドバイスしたように、列に一意の制約を追加します。次に、単語が重複している場合にエラーをスローする単純な挿入を使用できます。

INSERT INTO word_table (word) 
VALUES ('sinecure') ;

またはINSERT IGNOREエラーを無視する :

INSERT IGNORE INTO word_table (word) 
VALUES ('sinecure') ;
于 2012-09-03T21:19:07.840 に答える
0

フィールドワードには、一意のキー制約が必要です。インデックスを作成するだけで、それを手に入れることができます。

于 2012-09-03T21:16:04.020 に答える