Database:Constraints
데이터베이스 제약조건에 대한 설명.
식별 관계의 비교
식별관계는 아래와 같이 있다.
- 식별(Identifying)
- 비식별(Non-Identifying)
- 선택적 비식별(Optional Non-Identifying )
한 답변으로 아래와 같다.
식별관계냐 비식별관계냐는 erd를 작성하는 사람의 판단에 따른다고 생각합니다.
자식테이블의 pk를 구성하는 칼럼이 부모로부터 받는 거라면 식별이고
그렇지 않고 단순한 데이타 저장용 칼럼이라면 비식별 관계가 되겠지요.
이때 부모로 부터 받은 칼럼을 일반 칼럼으로 잡을 수도 있지만 pk로도 잡을 수 있는 애매한 상황등이 존재하는데 pk칼럼을 구성하는 원칙중 최소한의 원칙이란 것이 있습니다.
즉 자식테이블의 pk를 구성하는 칼럼이 col1,col2,col3,col4 4개가 있고 col4는 부모로부터 받은 칼럼입니다.
그런데 자식테이블 로우의 유일성을 구분할 수 있는 것이 col1,col2,col3만으로도 충분하다면 col4는 pk 구성에서 빠져야 합니다.
그렇다면 처음에는 식별관계였다가 이후 비식별관계가 되겠지요.
간단히 설명드렸는데 데이타베이스의 설계는 1+2=3 이다 이런식으로 수학공식처럼 딱 떨어지지 않는 부분이 많습니다.
상당히 인문학적인 요소가 들어간다고 할까요?
사실 개판으로 erd를 만들어도 프로그래머가 고생하고 엄청나게 비효율적인 프로그램이 만들어지고 유지보수가 어려울 뿐이지 프로그램이 안돌아가는 것은 아닙니다.
다만 훌륭하게 erd가 만들어지면 프로그램 소스가 깔끔하게 나오고 유지보수도 쉬어지면 그만큼 효율적인 시스템이 되겠지요.
장황하게 말씀드렸는데 결론은 erd작성에는 정답이 별로 없다라는 것입니다.
Foreign key constraints
- ON DELETE NO ACTION
- 다른 테이블의 기존 행에 있는 외래 키에서 참조하는 키가 포함된 행을 삭제하려고 하면 오류가 발생하고 DELETE 문이 롤백되도록 지정합니다.
- ON UPDATE NO ACTION
- 다른 테이블의 기존 행에 있는 외래 키에서 참조하는 키가 포함된 행에서 키 값을 업데이트하려고 하면 오류가 발생하고 UPDATE 문이 롤백되도록 지정합니다.
CASCADE, SET NULL 및 SET DEFAULT를 사용하면 내용이 수정된 테이블로 역추적할 수 있는 외래 키 관계를 갖도록 정의된 테이블에 키 값의 삭제 또는 업데이트가 적용되도록 할 수 있습니다. 대상 테이블에서도 연계 참조 작업이 정의되어 있다면 테이블에서 삭제 또는 업데이트된 행에 대해서도 지정된 연계 동작이 적용됩니다. timestamp 열이 있는 외래 키나 기본 키에는 CASCADE를 지정할 수 없습니다.
- ON DELETE CASCADE
- 다른 테이블의 기존 행에 있는 외래 키에서 참조하는 키가 포함된 행을 삭제하려고 하면 해당 외래 키가 포함되어 있는 모든 행도 삭제되도록 지정합니다.
- ON UPDATE CASCADE
- 다른 테이블의 기존 행에 있는 외래 키에서 참조하는 키 값이 포함된 행에서 키 값을 업데이트하려고 하면 해당 외래 키를 구성하는 모든 값도 키에 지정된 새 값으로 업데이트되도록 지정합니다.
- ON DELETE SET NULL
- 다른 테이블의 기존 행에 있는 외래 키에서 참조하는 키가 포함된 행을 삭제하려고 하면 해당 행에서 참조되는 외래 키를 구성하는 모든 값이 Null로 설정되도록 지정합니다. 이 제약 조건을 실행하려면 대상 테이블의 모든 외래 키 열에서 Null이 허용되어야 합니다.
- ON UPDATE SET NULL
- 다른 테이블의 기존 행에 있는 외래 키에서 참조하는 키가 포함된 행을 업데이트하려고 하면 해당 행에서 참조되는 외래 키를 구성하는 모든 값이 Null로 설정되도록 지정합니다. 이 제약 조건을 실행하려면 대상 테이블의 모든 외래 키 열에서 Null이 허용되어야 합니다.
- ON DELETE SET DEFAULT
- 다른 테이블의 기존 행에 있는 외래 키에서 참조하는 키가 포함된 행을 삭제하려고 하면 해당 행에서 참조되는 외래 키를 구성하는 모든 값이 기본값으로 설정되도록 지정합니다. 이 제약 조건을 실행하려면 대상 테이블의 모든 외래 키 열에 DEFAULT 정의가 있어야 합니다. 열에 Null이 허용되고 명시적 기본값이 설정되어 있지 않은 경우 NULL은 해당 열의 암시적 기본값이 됩니다. ON DELETE SET DEFAULT에 의해 Null이 아닌 값이 설정된 경우 외래 키 제약 조건의 유효성을 유지하려면 기본 테이블에 해당 값이 있어야 합니다.
- ON UPDATE SET DEFAULT
- 다른 테이블의 기존 행에 있는 외래 키에서 참조하는 키가 포함된 행을 업데이트하려고 하면 해당 행에서 참조되는 외래 키를 구성하는 모든 값이 기본값으로 설정되도록 지정합니다. 이 제약 조건을 실행하려면 대상 테이블의 모든 외래 키 열에 DEFAULT 정의가 있어야 합니다. 열에 Null이 허용되고 명시적 기본값이 설정되어 있지 않은 경우 NULL은 해당 열의 암시적 기본값이 됩니다. ON UPDATE SET DEFAULT에 의해 Null이 아닌 값이 설정된 경우 외래 키 제약 조건의 유효성을 유지하려면 기본 테이블에 해당 값이 있어야 합니다.
Favorite site
- [https://technet.microsoft.com/ko-kr/library/ms175464(v=sql.105.aspx TechNet: Microsoft SQL Server: FOREIGN KEY 제약 조건]
- MySQL DB 테이블 간의 관계 맺어주기 - 참조 무결성, 참조키, 여러가지 패턴