나)참조키 테이블 생성 CREATE TABLE employee ( emp_id int IDENTITY (1, 1) NOT NULL CONSTRAINT PK_employee_id PRIMARY KEY (emp_id) , emp_name char (10) NOT NULL , dept_code char (5) NOT NULL -- foreign key references dept(dept_code) ) GO
현재 dept 와 employee 테이블은 서로 관계(참조키)가 없는 상태에서 데이타 삽입 INSERT employee VALUES ('지순', '10001') 확인 select * from employee
제약조건 추가하기위한 테이블 수정 작업 ALTER TABLE employee ADD CONSTRAINT FK_dept_code FOREIGN KEY (dept_code) REFERENCES dept (dept_code) -- 에러
이유 : employee 테이블에 dept 테이블에 존재하지 않는 데이타가 먼저 삽입 되었기 때문이다. 제약 추가시 기존데이타 제약 검사가 이루어지므로, 기존데이타 제약개체의 성격에 맞지
않을경우에는 제약이 추가되지 않는다.
select * from dept select * from employee
기존 데이타 제약검사 무시하고, 제약 추가하는 명령어 : with nocheck
ALTER TABLE employee WITH NOCHECK -- 추가된 코드 ADD CONSTRAINT FK_dept_code2 FOREIGN KEY (dept_code) REFERENCES dept (dept_code) on update cascade -- 기본키 테이블이 업데이트 되면, 자동으로 참조키 테이블도 업데이트 된다.
제약조건(참조키)이 추가된 상테에서 데이타 삽입 INSERT dept VALUES ('10001', '영업')
INSERT employee VALUES ('규창', '10002') -- 제약 조건 검사에 의하여 에러
위의 구문이 제약 조건 에러가 나지 않기 위해서는 기본키 테이블에 데이타가 먼저 존재해야 한다. INSERT dept VALUES ('10002', '기획') INSERT employee VALUES ('규창', '10002')
확인 select * from dept select * from employee
기본키 테이블의 데이타 변경 : on update cascade 기능을 생각하자.
UPDATE dept SET dept_code = '00002' WHERE dept_code = '10002' 확인 select * from dept select * from employee
테이블 삭제하는 명령어 DROP TABLE dept
sp_help : 개체에 대한 정보를 전체적으로 보여주는 시스템 저장 프로시저 sp_helpconstraint : 테이블에 대한 제약조건 정보를 보여주는 시스템 저장 프로시저 sp_depends : 개체를 참조하는(종속되고) 있는 정보를 보여주는 시스템 저장 프로시저
sp_help dept
sp_helpconstraint dept sp_helpconstraint employee
use pubs go sp_depends 'titles'
제약 조건 검사에 대한 제어
가) 테이블 생성
CREATE TABLE DeferTest ( id int CONSTRAINT PK_DeferTest_id PRIMARY KEY, -- 컬럼 수준의 제약 , city varchar(10) null )
나) 데이타를 삽입
INSERT DeferTest VALUES (1, '목포') 확인 SELECT * FROM DeferTest
다) 제약 조건 추가가 에러가 난다.
-- 기존데이타와 제약 추가내용이 충돌이 되어서 에러가 남(제약검사) ALTER TABLE DeferTest ADD CONSTRAINT ck_DeferTest CHECK (city in ('서울', '부산', '광주','제주') )
라) with nocheck 옵션을 사용하여, 제약 조건 추가( 기존데이타 무시 )
ALTER TABLE DeferTest WITH NOCHECK ADD CONSTRAINT ck_DeferTest CHECK (city in ('서울', '부산', '광주', '제주') ) -- 정상 실행
SELECT * FROM DeferTest -- 목포가 있음에도 불구하고 제약은 만들어졌다.
댓글 영역