programing

UNIQUE 제약 조건(필드에 특정 값이 포함된 경우에만 해당)

muds 2023. 9. 28. 08:52
반응형

UNIQUE 제약 조건(필드에 특정 값이 포함된 경우에만 해당)

두 개의 열에 대해 UNIECIAL INDEX 제약 조건을 만들려고 하는데 다른 열에 1 값이 포함된 경우에만 해당합니다.예를들면,column_1그리고.column_2다음과 같은 경우에만 고유해야 합니다.active = 1. 다음을 포함하는 행active = 0값을 공유할 수 있습니다.column_1그리고.column_2다른 행의 값에 상관없이 다른 행을 사용합니다.active하지만 행들은active = 1의 가치를 공유할 수 없습니다column_1아니면column_2한 줄 더 늘어서고active = 1.

제가 말하는 "공유"란 같은 열에 있는 같은 값의 행 두 개를 의미합니다.예제: row1.a = row2.a 및 row1.b = row2.b.값은 1행의 두 열이 2행의 다른 두 열과 일치하는 경우에만 공유됩니다.

분명히 했길 바래요. :\

column_1, column_2, active로 multi-column UNIQUE 인덱스를 만든 후 active=로 설정하면 됩니다.고유성이 필요하지 않은 행의 NULL입니다.또는 트리거를 사용하고(MySQL 트리거 구문 참조), 삽입/업데이트된 각 행에 대해 해당 값이 이미 테이블에 있는지 확인할 수 있지만 다소 느릴 것으로 생각됩니다.

두 열에 대해 유니크 인덱스 제약 조건을 만들려고 하는데 다른 열에 값 1이 포함된 경우에만 해당합니다.

"another column" 값을 레코드의 id와 같은 1이 아닌 고유한 값으로 설정할 수 있습니다.

그러면 고유 인덱스 제약 조건이 "다른 열"을 포함한 세 열에 모두 적용될 수 있습니다."다른 열" 열을 X라고 합시다.레코드에 고유한 제약 조건을 적용하려면 열 X의 값을 1로 설정합니다.고유한 제약 조건을 적용하지 않으려면 열 X의 값을 고유한 값으로 설정합니다.

그러면 별도의 작업이나 트리거가 필요 없습니다.세 열 모두에 대한 고유한 인덱스를 사용하면 문제를 해결할 수 있습니다.

MySQL 구문에 대해서는 잘 모르지만 SQL Server와 거의 동일한 구문을 가져야 합니다.

CREATE UNIQUE INDEX [UNQ_Column1Column2OnActive_MyTable]
  ON dbo.[MyTable]([column1,column2)
  WHERE   ([active] = 1);

이 인덱스를 사용하면 active=1인 경우 열1과 열2 조합이 테이블 전체에서 고유한지 확인할 수 있습니다.

SQL Server에서는 검사 제약 조건으로 이 작업을 수행할 수 있지만 MySQL에서 이와 유사한 작업을 지원하는지는 알 수 없습니다.

어떤 데이터베이스에서도 작동하는 것은 테이블을 둘로 나눌 수 있다는 것입니다.active = 0인 레코드가 히스토리 레코드일 뿐이며 다시는 활성화되지 않을 경우 다른 테이블로 이동하여 원래 테이블에 간단한 고유 제약 조건을 설정할 수 있습니다.

100% 이해할 수는 없지만 상태 열이 있는 테이블이 있고 상태가 'A'(Active)인 원시가 하나인지 확인하려고 합니다.상태가 'I' 또는 'Z'인 행이 많더라도 상관없습니다.'A' 상태의 행은 하나만 허용됩니다.

이렇게 하면 효과가 있습니다.

  CREATE UNIQUE INDEX [Idx_EvalHeaderOnlyOneActive]
  ON [dbo].[EvalHeader]([Hdr Status])
  WHERE [Hdr Status] = 'A';

인덱스는 외부 영향에 대한 불가지론입니다.이러한 제약 조건은 데이터베이스 외부에서 구현해야 합니다.

언급URL : https://stackoverflow.com/questions/4955704/unique-constraint-only-when-a-field-contains-a-specific-value

반응형