メールアドレスに一意のキーがありません 。多くのJohnDoeがシステムに参加できるので、それがあなたの最善の希望です。したがって、フルネームの一意の複合インデックスは決して良い考えではありません。
重複違反の後に何も起こらないかのように進行するINSERTIGNOREを発行できます(これは非常に推奨されておらず、電子メールに固有の制約がないため不可能です)。これを行う際の主な問題は、あなたの傾向(おそらく読む)が起こっていることの流れのすべての制御を失い、望ましくないデータが残ることです。したがって、プロでない限り、使用しないでください。
INSERT ON DUPLICATE KEY UPDATE (別名IODKU)これも一意のキーを必要とします(一意のコンポジットにすることもできます)。そのため、新しい行は発生しませんが、行が更新されます。例として、4列の新しい行を挿入できますが、重複違反の場合は、
などの2つの列だけで更新を実行できます。
以下で、見えない列のPKを想定しますid int
、およびemailAddr
の一意のキー
insert person(firstName,lastName,emailAddr) values 'Joe','Smith','[email protected]'
on duplicate key update firstName='Joe',lastName='Smith'
これを機能させるのは、emailAddrの一意のキーです。 emailAddrごとに1行しか残されていません。
したがって、Joe Smithsを無制限に使用できますが、メールアドレスごとに1行しか使用できません。
上記のテーブルの作成テーブルは次のようになります
create table person
( id int auto_increment primary key,
firstName varchar(50) not null,
lastName varchar(50) not null,
emailAddr varchar(150) not null,
unique key(emailAddr) -- without this, IODKU will not work
);
また、ALTER TABLEコマンドを発行して、テーブルの作成後に制約を追加することもできます。その中のデータによっては、通話が失敗する場合があります。
Mysql 重複キー更新に挿入 、および変更テーブル マニュアルページ。
もう一度言いますが、適切なスキーマ設定がないと、IODKUは機能せず、不要な行が残ります。だから、それについて怠惰にならないでください。スキーマを最初に設定します (一意のキーを使用して)成功させるには、次に IODKUの使用に進みます。