2016-08-23 2 views
0
내가 삽입 전에 시작 트리거가있는 테이블에 하나 개 삽입 쿼리를 여러 행을 삽입하고 조건에 해당하는 경우 중복-예외를 발생하는 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 ; 

내가 쿼리

을 무시하고 사용하는 경우에도 중복 레코드 삽입하려고

특급 : 그것은 처음 중복 '[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

왜 'UNIQUE'색인이 수행하는 트리거를 사용하고 있습니까? 이메일을 선택하여 존재 여부를 확인합니다 - 이유는 무엇입니까? 고유 인덱스를 배치하고 INSERT IGNORE 또는 ON DUPLICATE KEY UPDATE 만 사용하십시오. 당신의 문제에 대한 해결책은 방아쇠에 의해 제기 된'sqlstate'를 무시하는 것이 아니라, 해결책은 적절한 도구를 사용하고 있습니다 - 귀하의 경우 적절한 도구는'email' 필드의 색인입니다. 전자 메일의 해시를 포함하는 필드를 만들어 테이블에 고정 길이의 고유 한 열을 항상 유지함으로써 효율적으로 만들 수도 있습니다. 그런 다음 코드는 간단한 삽입이며 트리거가 필요하지 않습니다. –

+0

Thanks @ N.B. 당신의 충고에 대해 :) 하지만 전자 메일에서 UNIQUE INDEX를 사용할 경우 파티션 규칙 때문에 제약 조건에 'id'를 추가해야합니다. _A UNIQUE INDEX는 테이블의 파티션에 모든 열을 포함해야합니다. – TAHIRI

+0

파티션을 사용하는 경우 , 그렇다. 그러나 질문은 - 왜 처음부터 파티셔닝을 사용합니까? 다른 하드 드라이브에 데이터를 파티셔닝하고 있습니까 아니면 동일한 하드 드라이브에 있습니까? –

답변

0

아니요,이 트리거가 활성화되어있는 동안 중복 행을 삽입 할 수 없습니다.
트리거를 피하는 것이 좋지 않은 경우 대신 트리거를 시작하는 데 필요한 조건 집합을 변경해야한다고 생각해야합니다.

+0

당신의 충고에 대해 @Liannis 감사합니다 :) 나는 방아쇠없이 해결책을 찾으려고 노력할 것입니다. – TAHIRI