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가 중단되었습니다.
트리거로 발생하는 예외를 무시할 수있는 해결책이 있습니까?
왜 'UNIQUE'색인이 수행하는 트리거를 사용하고 있습니까? 이메일을 선택하여 존재 여부를 확인합니다 - 이유는 무엇입니까? 고유 인덱스를 배치하고 INSERT IGNORE 또는 ON DUPLICATE KEY UPDATE 만 사용하십시오. 당신의 문제에 대한 해결책은 방아쇠에 의해 제기 된'sqlstate'를 무시하는 것이 아니라, 해결책은 적절한 도구를 사용하고 있습니다 - 귀하의 경우 적절한 도구는'email' 필드의 색인입니다. 전자 메일의 해시를 포함하는 필드를 만들어 테이블에 고정 길이의 고유 한 열을 항상 유지함으로써 효율적으로 만들 수도 있습니다. 그런 다음 코드는 간단한 삽입이며 트리거가 필요하지 않습니다. –
Thanks @ N.B. 당신의 충고에 대해 :) 하지만 전자 메일에서 UNIQUE INDEX를 사용할 경우 파티션 규칙 때문에 제약 조건에 'id'를 추가해야합니다. _A UNIQUE INDEX는 테이블의 파티션에 모든 열을 포함해야합니다. – TAHIRI
파티션을 사용하는 경우 , 그렇다. 그러나 질문은 - 왜 처음부터 파티셔닝을 사용합니까? 다른 하드 드라이브에 데이터를 파티셔닝하고 있습니까 아니면 동일한 하드 드라이브에 있습니까? –