2つの列で設定された単純なテーブルがあり、各列はキー値です。各フィールドに格納される値は、電子メールアドレスとキーワードを表すvarchar(45)です。収集された情報は、サイト閲覧データの収集に関連しているため、重複する可能性があります。エントリの重複を避けるために、INSERT IGNORE into、REPLACE intoを使用して、最後に次のことを試みました。
insert into <table name> (user_email, key_token) values ('<email>@<this>.com', 'discountsupplies') on duplicate key update user_email='<email>@<this>.com',key_token='discountsupplies';
しかし、まだ重複したレコードがテーブルに挿入されているのがわかります。テーブルを生成したSQL:
DROP TABLE IF EXISTS `<database name>`.`<table name>` ;
CREATE TABLE IF NOT EXISTS `<database name>`.`<table name>` (
`user_email` VARCHAR(45) NOT NULL ,
`key_token` VARCHAR(45) NOT NULL,
PRIMARY KEY (`user_email`, `key_token`) )
ENGINE = InnoDB;
これに近い質問をいくつか見ましたが、なぜこれが起こっているのかを説明する質問は見当たりませんでした。この動作について理解していないことを理解したいと思います。どんな助けでも大歓迎です。
補遺として、UNIQUE KEYステートメントを追加した後、戻ってREPLACEとINSERT IGNOREの両方を試し、目標を達成しました。これらのオプションはいずれも、重複するエントリを除外していません。
また、追加:UNIQUE INDEX(user_email
、key_token
)も役に立たないようです。
これを理解できるまで、手動のルックアップルーチンを介してこのチェックを実行します。答えが見つかったら、投稿を更新させていただきます。
元のcreatetableステートメントの下に一意のインデックス行を追加しました-
-- -----------------------------------------------------
-- Table `<db name>`.`<table name>`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `<db name>`.`<table name>` ;
CREATE TABLE IF NOT EXISTS `<db name>`.`<table name>` (
`user_email` VARCHAR(45) NOT NULL ,
`key_token` VARCHAR(45) NOT NULL,
PRIMARY KEY (`user_email`, `key_token`),
UNIQUE KEY (user_email),
UNIQUE KEY (key_token)
)
ENGINE = InnoDB;
CREATE UNIQUE INDEX ix_<table name>_useremail on `<db name>`.`<table name>`(user_email);
CREATE UNIQUE INDEX ix_<table name>_keytoken on `<db name>`.`<table name>`(key_token);
問題はないようですが(ソースステップでテーブルを作成するときにエラーは発生しません)、重複クエリを実行すると重複が発生します。