0

auto_incrementing id 列 (主キー) と、さまざまなテキストを含む TEXT 列で構成される非常に基本的なテーブルがあります。

このテーブルにデータを挿入する必要がありますが、重複する行を挿入したくありません。私は使用を考えINSERT IGNORE INTOましたが、どうやらIGNOREテーブルのキーを使用して行が重複しているかどうかを判断しているようです。私のテーブルのキー フィールドは自動インクリメントであるため、重複が表示されることはありません。

テーブルの設計により良いアプローチはありますか? TEXT 列もキーにする必要がありますか?

4

3 に答える 3

2

TEXT 列の UNIQUE インデックスを作成します。

エラーは無視されます。

http://dev.mysql.com/doc/refman/5.1/en/insert.htmlを参照してください。

于 2012-04-26T16:01:24.393 に答える
1

編集:このチュートリアルに従うだけで、 http : //www.tutorialspoint.com/mysql/mysql-handling-duplicates.htm に設定する必要があります 。

主なポイントは既にありましたが、TEXT を主キーとして設定するだけで、前に述べたように Insert Ignore を実行する限り、心配する必要はありません。

于 2012-04-26T16:04:30.510 に答える
0

before insert トリガーを使用し、最初の 255 文字のハッシュ (MD5) を使用することをお勧めします

このサンプルを実行する

drop database if exists jakobud;
create database jakobud;
use jakobud
create table mytext
(
    id int not null auto_increment,
    txt text not null,
    txtmd5 char(32) not null default '',
    primary key (id),
    unique key (txtmd5)
);
DELIMITER $$    
CREATE TRIGGER mytext_bi
    BEFORE INSERT ON mytext
    FOR EACH ROW    
BEGIN
    DECLARE found_count INT;

    SELECT COUNT(1) INTO found_count
    FROM mytext WHERE txtmd5 = MD5(LEFT(new.txt,10));
    IF found_count = 1 THEN
        SELECT COUNT(1) INTO found_count FROM table_that_does_not_exist;
    END IF;
    SET new.txtmd5 = MD5(LEFT(new.txt,10));
END; $$    
DELIMITER ;   

次に、大量のデータを mytext にロードします

これにより、最初の 255 文字の MD5 の重複が無視されます。

このように書いたので、txtフィールド自体にインデックスを作成する必要はありません

メリットは何ですか?最初の 255 文字の MD5 が一意でないテキストが入力された場合にトリガーを故意に中断させるため、auto_increment はスキップしません。

試してみる !!!

于 2012-04-26T17:14:31.860 に答える