- 전체
- Sample DB
- database modeling
- [표준 SQL] Standard SQL
- G-SQL
- 10-Min
- ORACLE
- MS SQLserver
- MySQL
- SQLite
- postgreSQL
- 데이터아키텍처전문가 - 국가공인자격
- 데이터 분석 전문가 [ADP]
- [국가공인] SQL 개발자/전문가
- NoSQL
- hadoop
- hadoop eco system
- big data (빅데이터)
- stat(통계) R 언어
- XML DB & XQuery
- spark
- DataBase Tool
- 데이터분석 & 데이터사이언스
- Engineer Quality Management
- [기계학습] machine learning
- 데이터 수집 및 전처리
- 국가기술자격 빅데이터분석기사
- 암호화폐 (비트코인, cryptocurrency, bitcoin)
ORACLE 체크 제약조건 적용사례
2014.01.19 18:29
[출처] http://raltigue.tistory.com/53
체크 제약조건 적용사례
체크 제약조건 적용사례를 정리해보자.
아래와 같이 테이블을 준비하자. 테이블에는 경제지표 데이터가 저장되며 주별은 해당주의 일요일, 월별·분기별·연별은 각각 말일로 일자를 저장해야 한다. 즉 일별을 제외한 기간은 기간별로 각각 1건만 존재해야 한다.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 |
CREATE TABLE t1 ( c1 VARCHAR2(5), -- 코드 c2 VARCHAR2(1), -- 기간 (D, W, M, Q, Y) c3 VARCHAR2(8), -- 일자 c4 NUMBER DEFAULT 0 NOT NULL -- 값 ); ALTER TABLE t1 ADD CONSTRAINT t1_pk PRIMARY KEY (c1, c2, c3); ALTER TABLE t1 ADD CONSTRAINT t1_c1 CHECK (c3 = CASE c2 WHEN 'D' THEN TO_CHAR (TO_DATE (c3, 'YYYYMMDD'), 'YYYYMMDD') WHEN 'W' THEN TO_CHAR (NEXT_DAY (TO_DATE (c3, 'YYYYMMDD') - 1, 1), 'YYYYMMDD') WHEN 'M' THEN TO_CHAR (LAST_DAY (TO_DATE (c3, 'YYYYMMDD')), 'YYYYMMDD') WHEN 'Q' THEN TO_CHAR (TRUNC (ADD_MONTHS (TO_DATE (c3, 'YYYYMMDD'), 3), 'Q') - 1, 'YYYYMMDD') WHEN 'Y' THEN TO_CHAR (TRUNC (ADD_MONTHS (TO_DATE (c3, 'YYYYMMDD'), 12), 'Y') - 1, 'YYYYMMDD') END); |
아래와 같이 쿼리를 실행하면 1~5행까지는 에러가 발생한다.
|
1
2
3
4
5
6
7
8
9
10 |
insert into t1 values('00001', 'D', '20120500', 1); -- ORA-01847 insert into t1 values('00001', 'W', '20120503', 2); -- ORA-02290 insert into t1 values('00001', 'M', '20120530', 3); -- ORA-02290 insert into t1 values('00001', 'Q', '20120531', 4); -- ORA-02290 insert into t1 values('00001', 'Y', '20120531', 5); -- ORA-02290 insert into t1 values('00002', 'D', '20120501', 1); insert into t1 values('00002', 'W', '20120504', 2); insert into t1 values('00002', 'M', '20120531', 3); insert into t1 values('00002', 'Q', '20120630', 4); insert into t1 values('00002', 'Y', '20121231', 5); |
① ORA-01847: 달의 날짜는 1에서 말일 사이어야 합니다 ② ORA-02290: 체크 제약조건(T1_C1)이 위배되었습니다
결과는 아래와 같다.
|
1
2
3
4
5
6
7
8
9
10
11
12 |
SELECT a.* FROM t1 a; C1 C2 C3 C4 ----- -- -------- -- 00002 D 20120501 1 00002 W 20120504 2 00002 M 20120531 3 00002 Q 20120630 4 00002 Y 20121231 5 5 rows selected. |
9i에서는 조회시 체크 제약조건이 필터 조건으로 사용된다...--; 아래와 같이 세션을 조정하면 해결할 수 있다.
|
1 |
ALTER SESSION SET EVENTS '10195 trace name context forever, level 1'; |
본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.

