2016-08-23 10 views
0
私は、挿入の前に立ち上げたトリガを持つテーブルの上に1つのINSERTクエリで複数の行を挿入し、条件が真の場合、重複-例外を発生させるtriyingてる

によって発生した例外挿入無視したときにトリガ

テーブル構造

CREATE TABLE `users` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `first_name` varchar(50) DEFAULT NULL, 
    `last_name` varchar(50) DEFAULT NULL, 
    `date_registration` date DEFAULT NULL, 
    `email` varchar(255) NOT NULL, 
    `password` varchar(128) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `email` (`email`), 
    KEY `date_registration` (`date_registration`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 
/*!50100 PARTITION BY RANGE (id) 
(PARTITION id1k VALUES LESS THAN (1000) ENGINE = MyISAM, 
PARTITION id3k VALUES LESS THAN (3000) ENGINE = MyISAM, 
PARTITION id7k VALUES LESS THAN (7000) ENGINE = MyISAM, 
PARTITION id10k VALUES LESS THAN (10000) ENGINE = MyISAM, 
PARTITION id13k VALUES LESS THAN (13000) ENGINE = MyISAM, 
......... 

トリガ・コード

delimiter // 
drop trigger if exists users_before_insert // 
create trigger users_before_insert before insert on users 
for each row 
begin 
set @found := false; 
select true into @found from users u where u.email = NEW.email; 
if @found then 
signal sqlstate '23000' set message_text = 'Email alread exists !'; 
end if; 
end // 
delimiter ; 

私は、クエリが

を無視し使用している場合でも、重複レコードを挿入しようとすると

EXP:それは[email protected]初重複することになると

insert ignore into users (first_name,last_name,date_registration,email,password) values 
('aaaa','zzzz','2016-08-20','[email protected]','strongpwd1'), 
('bbbb','yyyy','2016-08-21','[email protected]','strongpwd2'), 
('cccc','xxxx','2016-08-22','[email protected]','strongpwd3'), 
('dddd','wwww','2016-08-23','[email protected]','strongpwd4'); 

ERROR 1644 (23000): Email alread exists ! 

たqryは中止しました。

トリガーによって発生した例外を無視するソリューションはありますか?

+1

なぜ「ユニーク」インデックスがエミュレートするトリガーを使用していますか?存在するかどうかを確認する電子メールを選択しています - なぜですか?ユニークなインデックスを配置し、 'INSERT IGNORE'または' ON DUPLICATE KEY UPDATE'を使うのはなぜですか?あなたの問題を解決するには、トリガーによって生成された 'sqlstate'を無視しないでください。適切なツールを使用しています。適切なツールは' email'フィールドのインデックスです。電子メールのハッシュを含むフィールドを作成することで、テーブル内に固定長の一意の列が常に存在するようにすることで効率化することもできます。あなたのコードは単なる挿入物であり、トリガは必要ありません。 –

+0

ありがとう@ N.B。あなたの助言のために:) しかし、電子メールでUNIQUE INDEXを使用している場合は、パーティション化ルールのために制約に 'id'を追加する必要があります。 _Aユニークインデックスはテーブルのパーティションにすべてのカラムを含める必要があります – TAHIRI

+0

、はい。しかし、まず最初にパーティション化を使用するのはなぜですか?別のハードドライブにデータを分割しているのですか、それとも同じものにありますか? –

答えて

0

いいえ、このトリガーはアクティブですが、重複する行を挿入することはできません。
トリガーを避けるようにしてください。代わりに、トリガーを起動するために必要な一連の条件を変更することを検討する必要があります。

+0

あなたの助言のために@Liannisに感謝します:) 私はトリガなしで解決策を見つけようとします – TAHIRI

関連する問題