한 열에 특정 값을 가질 수 있도록 데이터베이스 테이블을 제한하는 방법은 무엇입니까?
Oracle을 사용할 때 열 값이 'YES' 또는 'NO'일 수 있는 경우 한 행만 'YES' 값을 가질 수 있도록 테이블을 제한할 수 있습니까?
저는 차라리 테이블 구조를 다시 디자인하고 싶지만 이것은 불가능합니다.
[UDPATE] 안타깝게도 이 테이블에는 null 값이 허용되지 않습니다.
함수 기반 인덱스 사용:
create unique index only_one_yes on mytable
(case when col='YES' then 'YES' end);
Oracle은 완전히 null이 아닌 키만 인덱싱하며, 여기서 CASE 식을 사용하면 모든 'NO' 값이 null로 변경되어 인덱싱되지 않습니다.
이것은 엉성한 해킹이지만 열에 NULL이 허용되면 이전과 마찬가지로 "NO" 대신 NULL을 사용하고 "YES"를 사용할 수 있습니다.해당 열에 고유한 키 제약 조건을 적용하면 두 개의 "YES" 값을 얻을 수 없지만 여전히 많은 NO를 가질 수 있습니다.
업데이트: @Nick Pierpoint: 열 값이 "YES" 및 NULL로 제한되도록 확인 제약 조건을 추가할 것을 제안했습니다.그 구문은 그의 대답에서 모두 해결되었습니다.
Tom Kyte의 기사를 확인하고 싶으실 겁니다. 이 질문과 답변은 다음과 같습니다.
http://tkyte.blogspot.com/2008/05/another-of-day.html
요약: 트리거를 사용하지 않고, 자동 트랜잭션을 사용하지 않으며, 두 개의 테이블을 사용합니다.
Oracle 데이터베이스를 사용하는 경우 AskTom을 알고 그의 책을 가져와야 합니다.
테이블 정의에서 작동하지 않습니다.
그러나 저장 프로시저를 호출하는 트리거를 사용하여 테이블을 업데이트하는 경우 한 행에만 "YES"가 포함되도록 할 수 있습니다.
- 모든 행을 "아니오"로 설정
- 원하는 행을 YES로 설정합니다.
내 의견에서 yukondude의 이전 답변에 이어 고유 인덱스와 검사 제약 조건을 추가합니다.
create table mytest (
yesorno varchar2(3 char)
);
create unique index uk_mytest_yesorno on mytest(yesorno);
alter table mytest add constraint ck_mytest_yesorno check (yesorno is null or yesorno = 'YES');
Oracle은 필터링된 인덱스와 같은 것을 지원합니까(예: MSSQL2008)?열에 값이 "예"인 행에만 적용되는 고유 키를 정의할 수 있습니다.
두 번째 테이블을 사용하여 현재 테이블의 해당 행을 가리킵니다.다른 테이블은 다른 변수의 값을 저장하는 데도 사용할 수 있습니다.
언급URL : https://stackoverflow.com/questions/182262/how-to-constrain-a-database-table-so-only-one-row-can-have-a-particular-value-in
'programing' 카테고리의 다른 글
woocommerce 새 주문 전자 메일에 제품 미리 보기 표시 (0) | 2023.06.23 |
---|---|
WKWebView에서 target="_blank" 링크를 열지 않는 이유는 무엇입니까? (0) | 2023.06.23 |
스프링 보안에 대한 요청 Matchers() 이해 (0) | 2023.06.23 |
traceback / sys.exc_info() 값을 변수에 저장하는 방법은 무엇입니까? (0) | 2023.06.23 |
os.path.basename()과 os.path.dirname()의 차이점은 무엇입니까? (0) | 2023.06.18 |