SELECT * FROM obj; — tab, tabs로 안 보이는것도 다 보인다.
정확하지 않는 데이터를 저장되지 않기 위해 방지하는 것.
제약 조건이 많이 주면 많이 줄수록 INSERTR, UPDATE 등의 작업을 할때마다 효율이 떨어진다.
자바에서 제약 조건을 걸어주는게 좋다 → DB는 데이터 양이 너무 많기 떄문에 시간이 많이걸림
컬럼에 null 값을 허용하지 않는다.
PRIMARY KEY constraint
기본 키 제약 조건은 하나의 컬럼 또는 두 개 이상의 컬럼을 조합하여 여러 행이 동일한 값을 가질 수 없다. 기본키는 하나의 테이블에 하나만 지정할 수 있으며, null 값을 허용하지 않는다.(3개 이상의 컬럼을 조합하면 좀 힘들어진다..)
UNIQUE constraint
UNIQUE 제약 조건은 하나의 컬럼 또는 두 개 이상의 컬럼을 조합하여 여러 행이 동일한 값을 가질 수 없다.
UNIQUE 제약 조건은 하나의 테이블에 두 개 이상 지정 가능하며, null 값을 허용할 수 있다.(만들면 만들수록 인덱스가 만들어지고, 결과적으로 그만큼 메모리가 차지가된다.) 꼭 필요한 경우 사용할 것
FOREIGN KEY constraint
외래 키(FOREIGN KEY) 제약 조건은 한 테이블의 값이 다른 테이블의 값과 일치해야 한다.
CHECK constraint
CHECK 제약 조건은 지정된 조건을 만족하는 값만 가질 수 있다.
객체 무결성과 참조 무결성
형식
CREATE TABLE table_name (
column datatype [ CONSTRAINT constraint_name ]
{ [ NOT ] NULL | UNIQUE | PRIMARY KEY | references_clause | CHECK (condition) }
:
);
형식
CREATE TABLE table_name (
column datatype [inline_constraint],
:
[ CONSTRAINT constraint_name ]
{ PRIMARY KEY (column [, column ]...) | UNIQUE (column [, column ]...)
| FOREIGN KEY (column [, column ]...) references_clause
| CHECK (condition)
}
);
제약 조건 추가(NOT NULL 제외)
ALTER TABLE table_name ADD [ CONSTRAINT constraint_name ]
{ PRIMARY KEY (column [, column ]...) | UNIQUE (column [, column ]...)
| FOREIGN KEY (column [, column ]...) references_clause
| CHECK (condition)
} ;
ALTER TABLE table_name MODIFY column NOT NULL;
MODIFY - 수정
제약 조건 제거
ALTER TABLE table_name DROP
{ PRIMARY KEY
| CONSTRAINT constraint_name [ CASCADE ]
};
제약 조건 제거
ALTER TABLE table_name
RENAME CONSTRAINT old_name TO new_name;
SELECT u1.table_name, column_name, constraint_type, u1.constraint_name, search_condition
FROM user_constraints u1
JOIN user_cons_columns u2 ON u1.constraint_name = u2.constraint_name
WHERE u1.table_name = UPPER('테이블명');


R 은 참조키 아버지가 있다는 뜻 - 아버지가 누구인지는 모름
자기 참조 - EMPOLYEES 가 자기 자신을 아버지로 둔다?
SELECT fk.owner, fk.constraint_name,
pk.table_name parent_table, fk.table_name child_table
FROM all_constraints fk, all_constraints pk
WHERE fk.r_constraint_name = pk.constraint_name AND fk.constraint_type = 'R'
ORDER BY fk.table_name;
SELECT fk.owner, fk.constraint_name , fk.table_name
FROM all_constraints fk, all_constraints pk
WHERE fk.r_constraint_name = pk.constraint_name
AND fk.constraint_type = 'R'
AND pk.table_name = UPPER('테이블명')
ORDER BY fk.table_name;
SELECT table_name FROM user_constraints
WHERE constraint_name IN (
SELECT r_constraint_name
FROM user_constraints
WHERE table_name = UPPER('테이블명') AND constraint_type = 'R'
);
부모 2개 이상으로 기본키를 만든 경우 여러번 출력 됨
SELECT fk.constraint_name, fk.table_name child_table, fc.column_name child_column,
pk.table_name parent_table, pc.column_name parent_column
FROM all_constraints fk, all_constraints pk, all_cons_columns fc, all_cons_columns pc
WHERE fk.r_constraint_name = pk.constraint_name
AND fk.constraint_name = fc.constraint_name
AND pk.constraint_name = pc.constraint_name
AND fk.constraint_type = 'R'
AND pk.constraint_type = 'P'
AND fk.table_name = UPPER('테이블명');