두 개의 열이 같은 값을 가지지 않도록 할 수 있습니까?


11

이렇게 보이는 테이블이 있다면

CREATE TABLE foo (
   id INT NOT NULL AUTO_INCREMENT,
   aa INT NOT NULL,
   bb INT NOT NULL,
   PRIMARY KEY (id),
   UNIQUE KEY (aa, bb),
   CONSTRAINT aa_ref FOREIGN KEY (aa) REFERENCES bar (id),
   CONSTRAINT bb_ref FOREIGN KEY (bb) REFERENCES bar (id)
)

aa != bbINSERT 전에 애플리케이션 레벨 로직을 사용하거나 트리거를 강제로 실패 하는 것 외에 다른 방법이 있습니까?

답변:


3

MySQL은 CHECKcontrsaints를 직접 지원하지 않지만 최근에 충분한 버전이 있으면를 통해 트리거 및 오류 발생을 지원 SIGNAL하므로 의도 한 제약 조건이 충족되지 않으면 데이터를 확인하고 오류를 발생시키는 트리거를 정의 BEFORE INSERT하고 BEFORE UPDATE트리거 할 수 있습니다.

이것은 물론 점검 제한 조건에 대한 기본 지원보다 비효율적이므로, 해당 구조에 많은 양의 쓰기를 수행하는 경우 애플리케이션에 너무 많은 영향을주는 경우 트리거로 인한 성능 차이를 분석해야합니다.


9

아냐, 못해 대부분의 DBMS (Postgres, SQL-Server, Oracle, DB2 등)에서 CHECK제약 조건을 추가 할 수 있습니다 .

ALTER TABLE foo 
  ADD CONSTRAINT aa_cannot_be_equal_to_bb_CHK
    CHECK (aa <> bb) ;

참조 제약 조건 만 사용하여 MySQL에서 이것을 사용할 수있는 방법이 없습니다. 트리거 외에도 두 열이 동일한 값을 갖도록 허용하고 항상보기를 통해 테이블에 액세스하여 행을 무시하면됩니다.

CREATE VIEW foo_correct AS
SELECT id, aa, bb
FROM foo
WHERE aa <> bb ;

또는 제약 조건을 처리하고이를 충족하지 않는 데이터를 삽입 (또는 변경)하지 않는 저장 프로 시저를 통해 삽입 및 업데이트 작업을 제한 할 수 있습니다.



-1

문제의 두 열 모두 동일한 막대 테이블을 참조합니다. Bar 테이블을 두 개로 분할하여 서로 다른 값 세트의 id를 포함 할 수 있습니까?


1
그런 다음 Foo테이블에 세 커플이 있다고 가정 해보십시오 (1,2) (2,3) (3,1). 우리는 어떻게 세 가지 가치를 나누어야합니까?
ypercubeᵀᴹ

1
나는 잘못된 제안에 동의합니다.
msi77
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.