0

新しいレコードを挿入するときは、データが既に存在する場合は無視してください。

1) 列に UNIQUE INDEX を作成します。

2) INSERT IGNORE INTO ...

しかし、私の問題は、列の 1 つが VARCHAR(2000)** であり、MySQL ではインデックスに 1000 文字の制限があることです。

列は、id (int)、type (varchar 35)、data (varchar 2000) です。

1 つのクエリで同じデータを 2 回追加していないことを確認する方法はありますか? または、最初に選択して存在を確認し、偽の場合は挿入を実行する必要がありますか?

ありがとう。

** これは設計ではありません。データを移動しているだけなので、この列を小さくすることはできません。

4

2 に答える 2

0

あなたが言及したテーブルのデザインを考えると:

CREATE TABLE mydb.mytable
(
    id int not null auto_increment,
    type varchar(35),
    data varchar(2000),
    primary key (id)
);

あなたの最高のチャンスは次のとおりです。

CREATE TABLE mydb.mytable_new LIKE mydb.mytable;
ALTER TABLE mydb.mytable_new ADD COLUMN data_hash CHAR(40);
ALTER TABLE mydb.mytable_new ADD UNIQUE INDEX (data_hash);

INSERT INTO mydb.mytable_new (id,type,data,data_hash)
  SELECT id,type,data,UPPER(SHA(data)) FROM mydb.mytable;

ALTER TABLE mydb.mytable RENAME mydb.mytable_old;
ALTER TABLE mydb.mytable_new RENAME mydb.mytable;
DROP TABLE mydb.mytable_old;

この新しい列とインデックスを追加すると、テーブルは次のようになります。

CREATE TABLE mydb.mytable
(
    id int not null auto_increment,
    type varchar(35),
    data varchar(2000),
    data_hash char(40),
    primary key (id),
    unique key data_hash (data_hash)
);

次のように操作を実行するだけです。

INSERT

INSERT INTO mydb.mytable (type,data,data_hash)
VALUES ('somtype','newdata',UPPER(SHA('newdata')));

INSERT は data_hash で失敗するはずです。重複したキーの挿入を試みた場合

SELECT

SELECT * FROM mydb.mytable
WHERE data_hash = UPPER(SHA('data_I_am_searching_for'));

試してみる !!!

于 2013-01-25T18:31:44.050 に答える