programing

필드의 특정 값에 대한 테이블에 대한 고유한 제약 조건

copyandpastes 2022. 10. 1. 22:57
반응형

필드의 특정 값에 대한 테이블에 대한 고유한 제약 조건

송장표가 있습니다.많은 필드가 있지만 문제는 2개의 주요 필드입니다.

  • Invoice No - 영숫자 값
  • Deleted - 부울 1 또는 0 - 레코드가 삭제되었는지 여부를 나타냅니다.

당사의 비즈니스에서는 Invoice No가 고유해야 합니다.그러나 행이 삭제된 경우 Invoice No를 재사용할 수 있습니다.

InvoiceNo    Deleted
123Er        1
123Er        0

다음은 유효한 사용 사례입니다.하지만 123 Er & 0으로 또 다른 음반을 내고 싶지는 않습니다.

특정 값(InvoiceNo, Deleted=0)에 대해 두 필드를 조합하여 고유한 키를 생성할 수 있습니까? 아니면 저장 프로시저 또는 트리거를 사용해야 합니까?

다른 RDB에서는 쉽게 달성할 수 있습니다.함수 기반 인덱스를 지원하는 MS 시스템

현재 MySql에는 이러한 기능이 없지만 버전 5.7부터는 가상(또는 생성된) 열을 사용하여 시뮬레이트할 수 있습니다.

간단한 작업 예: http://rextester.com/HGY68688

CREATE TABLE IF NOT EXISTS mytable1234(
  InvoiceNo varchar(10),
  Deleted int,
  xxx varchar(10) generated always as (case when deleted = 0 then InvoiceNo end) virtual
);

create unique index myindex12 on mytable1234( xxx );

INSERT INTO mytable1234( InvoiceNo, Deleted)  VALUES ('aaa1', 0 );
INSERT INTO mytable1234( InvoiceNo, Deleted)  VALUES ('aaa1', 1 );
INSERT INTO mytable1234( InvoiceNo, Deleted)  VALUES ('aaa1', 1 );

-- INSERT INTO mytable1234( InvoiceNo, Deleted)  VALUES ('aaa1', 0 );

이 스니펫의 마지막 INSERT의 코멘트를 해제하고 이 스니펫을 실행하려고 하면 다음과 같이 표시됩니다.Duplicate entry 'aaa1' for key 'myindex12'에러입니다.
이렇게 하면 테이블 내에 같은 레코드가 여러 개 있을 수 있습니다.InvoiceNo의 가치를 인정하다.deleted = 1단, 의 값은 1개뿐입니다.deleted = 0MySql은 이를 허용하지 않기 때문입니다.

필드 이름을 다음과 같이 바꿀 수 있습니다.DeletedIfNull(또는IsActive).

그러면 열이 활성화되어 있는 경우 필드에 "1" 또는 "true" 등의 값이 지정됩니다.그건 그럴 것이다.NULL다른 값을 지정합니다.다음으로 다음을 작성할 수 있습니다.

create unique index unq_t_invoiceno_isactive on t(invoiceno, isactive);

MySQL(모든 데이터베이스는 아니지만)은 고유한 인덱스가 정의될 때 반복을 허용합니다.따라서, 이것은 당신의 당면한 문제를 해결할 것입니다.

원하는 키(Invoice No, Deleted)를 작성하기만 하면 됩니다.지원되지 않는 (Invoice No, Deleted=0)을 왜 작성해야 하는지 모르겠습니다.이 2개의 컬럼 중 하나의 키가 있으면 필요한 것을 얻을 수 있습니다.

업데이트: 동일한 값의 두 행이 삭제될 수 있다는 문제가 있습니다.이 경우 삭제된 값이 고유하지 않도록 Invoice No 열에 추가해 주십시오.

예를 들어 다음과 같습니다.123er를 가지고 삭제하면 123er-1이 됩니다.다른 하나를 삭제하면 123er-2가 됩니다.기본적으로 업데이트(전) 트리거로 실행할 수도 있습니다.

언급URL : https://stackoverflow.com/questions/47483853/unique-constraint-on-tables-for-particular-values-of-a-field

반응형