10

ペアが存在しない場合、行に挿入するにはどうすればよいですか?
* これらは主キーではないことに注意してください。主キーは自動インクリメントに設定されています。

挿入を無視しようとしましたが、機能しませんでした。

INSERT IGNORE INTO mytable (`myid`, `theirid`) VALUES ('5', '1')
ON DUPLICATE KEY <DO NOTHING>

テーブルは次のようになります。

CREATE TABLE `mytable` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
    `myid` bigint(20) NOT NULL,
    `theirid` bigint(20) NOT NULL,
    `activated` tinyint(1) NOT NULL DEFAULT '0',
    `dateStamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1$$
4

4 に答える 4

13

1) にUNIQUE制約を追加できます(myid, theirid)か? はいの場合、この制約を追加して使用します。

INSERT INTO mytable (myid, theirid) 
  VALUES (5, 1) ;

生成された警告を無視します(または上記を に置き換えますINSERT IGNORE

2)そのような制約を追加できない場合(たとえば、そのような重複を許可したい場合と許可したくない場合があります)、これを使用できます:

INSERT INTO mytable (myid, theirid) 
  SELECT 5, 1 
  FROM dual 
  WHERE NOT EXISTS
        ( SELECT *
          FROM mytable
          WHERE myid = 5
            AND theirid = 1
        ) ; 
于 2012-07-06T20:38:49.603 に答える
1

重複する場合については明確ではないと思います....それを使用するアイデアは、フィールドが重複している場合は、古いものを新しいものに置き換えるか、主キーを変更して一意にすることです...on duplicate do nothingデフォルトでは何もしないため、挿入しません。こちらをご覧ください

mysql> insert into t2 values (20000,'a','a',0);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t2 values (20000,'a','a',0);
ERROR 1062 (23000): Duplicate entry '20000' for key 'PRIMARY'

だからそれは「何もしなかった」。値が存在するかどうかを知りたい場合は、Insert の前に Select ステートメントを使用する必要があります。

于 2012-07-06T20:29:05.427 に答える
0

このクエリ (およびその他の環境要素) を実行する頻度にもよりますが、これらのフィールドに一意のインデックスを作成することは理にかなっていると思います。そうすれば、それらが重複している場合、mysql は単純に重複したエラー コードを返し、それをテーブルに追加しません。さらに、挿入された値が重複している場合にデータベース全体をチェックする必要がないことを考えると、このクエリの実行が大幅に高速化されます。

于 2012-07-06T20:27:20.330 に答える