sql >> データベース >  >> RDS >> Mysql

テーブルへの重複挿入を防ぐ方法

    メールアドレスに一意のキーがありません 。多くの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の使用に進みます。



    1. デフォルトとしてのMySQLCURRENT_TIMESTAMP

    2. 奇妙な丸めの問題

    3. クエリからのmysqldump

    4. PDOはリモートmysqlサーバーに接続できません