2013-04-26 2 views
1

다음 표가 있습니다.두 필드의 값이 같은 레코드를 만드는 것을 방지하려면 어떻게해야합니까?

CREATE TABLE people(
first_name VARCHAR(128) NOT NULL, 
nick_name VARCHAR(128) NULL 
) 

삽입을 시도하면 사람들의 닉네임이 첫 번째 이름과 동일하지 않게하고 싶습니다. first_name과 nick_name이 같은 곳에 레코드를 삽입하지 못하도록 규칙 중 하나에 인덱스를 작성하고 싶지 않습니다.

first_namenick_name 인 레코드를 삽입하지 못하도록 규칙을 만드는 방법이 있습니까?

+0

[이것은 현재 불가능하다. (http://stackoverflow.com/q/2115497/501250) MySQL이 CHECK 제약을 구현 할 때까지 애플리케이션 계층에서 수행이 고려, 또는 다른 데이터베이스 엔진을 사용. (PostgreSQL은 현재 내가 가장 좋아하는 것입니다.) 호기심에서 – cdhowie

+0

@cdhowie, 그것에 대해 무엇을 [ "트리거"] (http://stackoverflow.com/questions/2115497/check-constraint-in-mysql-is-not-working# 2115641) 답변? 작동하지 않습니까? – showdev

+0

나는 MySQL의 전문가는, 그러나, 트리거를 사용하여 솔루션, 예컨대 : http://blog.christosoft.de/2012/08/mysql-check-constraint/ 것 같다 아니에요; – Trinimon

답변

3
CREATE TRIGGER `nicknameCheck` BEFORE INSERT ON `people` FOR EACH ROW begin 
    IF (new.first_name = new.nick_name) THEN 
    SET new.nick_name = null; 
    END IF; 
END 

또는 SQL 오류가 발생할 수있는 first_name을 NULL로 설정할 수 있으며이를 처리하고 경고를 표시 할 수 있습니다.

+0

; 신호가 흥미로울 수도 있습니다. 'SIGNAL sqlstate '45000'SET message_text = '닉네임 위반'; ' – Trinimon

+0

삽입을 막지 못한다. 나의 2 값은 각각 NULL이 아니다. – ekerner

0

는 당신은 BEFORE INSERTBEFORE UPDATE에 대한 트리거가 필요합니다. 이들이 값을 검사하고 동등한 경우 작업을 중단하게하십시오.

경고 : 구식이지만 여전히 널리 사용되는 MySQL 버전 (5.5 IIRC 이전)에서는 작성한 테이블에서 읽거나, 존재하지 않는 테이블/열에서 읽기 쉽도록 (예 : 중단하기 위해) 나쁜 조치를 취해야합니다.

0

테스트와 같은 경우 제거하는 INSERT 트리거 ...

CREATE TABLE ek_test (
    id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, 
    one INT NOT NULL, 
    two INT NOT NULL 
); 

delimiter // 
CREATE TRIGGER ek_test_one_two_differ AFTER INSERT ON ek_test 
FOR EACH ROW 
BEGIN 
    IF (new.one = new.two) THEN 
    DELETE FROM ek_test WHERE id = new.id; 
    END IF; 
END// 
delimiter ; 

INSERT INTO ek_test (one, two) VALUES (1, 1); 

SELECT * FROM ek_test; 

주 후에 당신은 또한 UPDATE 트리거 이후에 ​​필요합니다.

관련 문제