문제

다음과 같은 테이블의 두 필드에서 고유 한 인덱스를 효율적으로 생성 할 수있는 방법 : 테이블 T (정수, B 정수)를 만듭니다.

두 개의 다른 숫자의 고유 한 조합이 테이블의 같은 행에 두 번 이상 나타날 수없는 경우.

순서로 행이 a = 1 및 b = 2 인 경우 행이 존재하는 경우, A = 2 및 b = 1 또는 a = 1 및 b = 2 인 경우 다른 행이 존재할 수 없습니다. 다시 말해 두 숫자는 어떤 순서로든 두 번 이상 함께 나타날 수 없습니다.

그러한 제약이 무엇인지 전혀 모르기 때문에 제목의 '양면 고유 인덱스'이름이 무엇인지 모르겠습니다.

업데이트: 열 (a, b)에 합성 키가 있고 데이터베이스에 행 (1,2)이 존재하는 경우 오류없이 다른 행 (2,1)을 삽입 할 수 있습니다. 내가 찾고있는 것은 같은 숫자가 두 번 이상 사용되는 것을 막는 방법입니다. 어떤 순서로든...

도움이 되었습니까?

해결책

테이블에 들어가는 것을 제어하여 항상 가장 작은 숫자를 첫 번째 열에 저장하고 두 번째 열에 가장 큰 숫자를 저장하는 것은 어떻습니까? 물론 그것이 같은 것을 의미하는 한. 데이터베이스에 도달하기 전에 그렇게하는 것이 저렴할 것입니다.

불가능하다면 필드를 그대로 저장할 수 있지만 숫자 순서로 두 개의 다른 필드로 복제 할 수 있습니다.

COLUMN A : 2
COLUMN B : 1

COLUMN A_PK : 1  ( if new.a < new.b then new.a else new.b )
COLUMN B_PK : 2  ( if new.b > new.a then new.b else new.a )

이것은 응용 프로그램에서 트리거 (Ronald의 응답에서와 같이) 또는 더 높은 처리로 쉽게 수행 할 수 있습니다.

다른 팁

For Insert 트리거 (두 열의 고유 한 제약 조건과 함께)를 사용하여 만 수행 할 수 있다고 생각합니다. 나는 실제로 MySQL 구문에 능통하지 않기 때문에 (내 T-SQL은 더 좋다) 다음에 몇 가지 오류가 포함된다고 생각합니다.

편집하다: 구문을 청소하여 MySQL에서 작동합니다. 또한, 아마도 이것을 BEFORE UPDATE 트리거도 트리거 (물론 다른 이름으로).

또한이 방법은 두 필드에 기본 또는 고유 키를 갖는 데 의존합니다 (예 : 트리거는 역전이 아직 존재하지 않습니다.) 트리거에서 오류를 던지는 방법은없는 것 같습니다. 그래서 나는 이것이 그것이 얻는 것만 큼 좋다고 감히 말한다.

CREATE TRIGGER tr_CheckDuplicates_insert
BEFORE INSERT ON t
FOR EACH ROW
BEGIN
    DECLARE rowCount INT;
    SELECT COUNT(*) INTO rowCount
                   FROM t
                   WHERE a = NEW.b AND b = NEW.a;

    IF rowCount > 0 THEN
        -- Oops, we need a temporary variable here. Oh well.
        -- Switch the values so that the key will cause the insert to fail.
        SET rowCount = NEW.a, NEW.a = NEW.b, NEW.b = rowCount;
    END IF;
END;

Oracle에서는 다음과 같은 기능 기반 색인을 사용할 수 있습니다.

create unique index mytab_idx on mytab (least(a,b), greatest(a,b));

MySQL을 모르지만 비슷한 것이 가능한가? 예를 들어, 테이블에 2 개의 새로운 열 및 위대한 열을 추가 할 수 있으며, 각각 최소 (A, B) 및 가장 큰 (A, B)의 값으로 유지 관리 한 다음 (ledestab에서 고유 한 인덱스를 만들 수 있습니다. , Greatestab).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top