필드의 특정 값에 대한 테이블에 대한 고유한 제약 조건
송장표가 있습니다.많은 필드가 있지만 문제는 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 = 0
MySql은 이를 허용하지 않기 때문입니다.
필드 이름을 다음과 같이 바꿀 수 있습니다.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
'programing' 카테고리의 다른 글
mcrypt는 권장되지 않습니다.대안은 무엇입니까? (0) | 2022.10.02 |
---|---|
라라벨 블랭크화이트스크린 (0) | 2022.10.02 |
python 함수 내부의 매개 변수 이름 목록을 가져오는 중 (0) | 2022.10.01 |
Blob을 바이트 배열로 변환하는 가장 쉬운 방법 (0) | 2022.10.01 |
문자열을 JavaScript 함수 호출로 변환하는 방법 (0) | 2022.10.01 |