0

宛先テーブルにレコードがまだ存在しない MySQL への挿入を行う必要があります。

私の質問

INSERT INTO comment (`mid`, `pid`, `comment_text`, `comment_date`, `comment_type`) 
 VALUES (180, 2, NULL, '2012-07-26 10:19:00', 'tag')  WHERE NOT EXISTS ( SELECT * FROM `comment` WHERE `mid`=180 AND `pid`=2 AND `comment_type`='tag')

ただし、これを実行すると、このエラーが発生します

SQL 構文にエラーがあります。'WHERE NOT EXISTS ( SELECT * FROM commentWHERE mid=180 AND `pid' at line 2 ) の近くで使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

基本的に、値が一致するときに重複する行がこのテーブルに追加されるのを止めたいというアイデア

4

3 に答える 3

1

試す:

INSERT IGNORE INTO comment
(
 `mid`, `pid`, `comment_text`, `comment_date`, `comment_type`
)
(
    SELECT 180, 2, NULL, '2012-07-26 10:19:00', 'tag'
    FROM comment
    WHERE `mid`=180 AND
          `pid`=2 AND
          `comment_type`='tag'
    LIMIT 1
);

編集:これを行うより良い方法:

テーブルから重複を削除するには、こちらを参照してください

ALTER IGNORE TABLE comment ADD UNIQUE KEY ix1(mid, pid, comment_type);

INSERT IGNORE INTO comment
(
 `mid`, `pid`, `comment_text`, `comment_date`, `comment_type`
)
VALUES 
(
 SELECT 180, 2, NULL, '2012-07-26 10:19:00', 'tag'
);
于 2012-07-26T09:55:57.433 に答える
0

mid、pid、comment_type 列で構成される一意のインデックスを作成しないのはなぜですか?

于 2012-07-26T09:57:58.003 に答える
0

を追加ignore

INSERT IGNORE INTO comment ...

重複挿入を防ぐため。whereで句を使用することはできませんinsert

IGNORE キーワードを使用すると、INSERT ステートメントの実行中に発生したエラーは代わりに警告として扱われます。たとえば、IGNORE を使用しない場合、テーブル内の既存の UNIQUE インデックスまたは PRIMARY KEY 値を複製する行は、重複キー エラーを引き起こし、ステートメントは中止されます。IGNORE を使用すると、行はまだ挿入されませんが、エラーは発行されません。

MySQL INSERT ドキュメントから取得

つまり、一意のキーをテーブルに追加して (まだ追加していない場合)、DB 自体が重複をチェックできるようにする必要があります。DB が重複を検出した場合、noINSERTは作成されません。

重複の場合UPDATEにも可能です。こちらをご覧ください

于 2012-07-26T09:52:26.243 に答える