Skip to content

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