복붙노트

[SQL] 외래 키 제약 조건 : 때 ON UPDATE 및 DELETE ON을 사용하는

SQL

외래 키 제약 조건 : 때 ON UPDATE 및 DELETE ON을 사용하는

난 당신이 다이어그램을 할 수 있고 그들을 변환하기 때문에 꽤 멋지다 MySQL의 워크 벤치를 사용하여 내 데이터베이스 스키마를 설계 해요 : P를

어쨌든, 나는 때문에 그것의 외래 키 지원의 이노를 사용하기로 결정했습니다. 그래도 발견 한 것은 당신이 업데이트에 키와 외래 키에 대한 삭제 옵션을 설정할 수 있다는 것입니다. "제한", "캐스케이드"와 세트 널 간단한 예제에 사용될 수있는 곳에 사람이 설명 할 수 있습니까?

예를 들어, 나는 사용자 ID를 포함하는 사용자 테이블을 말한다. 그리고이 메시지 테이블에 메시지가 있다고 대다 (사용자 테이블에서 같은 기본 키, 사용자 ID를 참조)이 외래 키를 가지고있다. 온 업데이트 및이 경우에 유용한 삭제 옵션에 설정되어 있습니까? 내가 어느 하나를 선택합니까, 그렇다면? 이 좋은 예가 아닌 경우, 당신은이 유용 할 수있는 방법을 설명하는 좋은 예와 제발 수 있을까?

감사

해결법

  1. ==============================

    1.데이터베이스에 제약을 넣어 주저하지 마십시오. 당신은 일관성있는 데이터베이스를 가지고 있는지 알 수있을 것입니다, 그것은 데이터베이스를 사용하는 좋은 이유 중 하나입니다. 당신은 (또는 하나의 응용 프로그램 만 다이렉트 모드와 다른 소스를 사용하여 배치 모드)을 요청하는 여러 응용 프로그램이 특히합니다.

    데이터베이스에 제약을 넣어 주저하지 마십시오. 당신은 일관성있는 데이터베이스를 가지고 있는지 알 수있을 것입니다, 그것은 데이터베이스를 사용하는 좋은 이유 중 하나입니다. 당신은 (또는 하나의 응용 프로그램 만 다이렉트 모드와 다른 소스를 사용하여 배치 모드)을 요청하는 여러 응용 프로그램이 특히합니다.

    당신은 PostgreSQL을에있는 것이지만, 적어도 외부 키 제한 조건이 매우 고급처럼 MySQL을 사용하면 고급 제약이 없습니다.

    우리는 논문의 회사에서 사람들을 포함하는 사용자 테이블과, 회사 테이블을 예를 할게요

    CREATE TABLE COMPANY (
         company_id INT NOT NULL,
         company_name VARCHAR(50),
         PRIMARY KEY (company_id)
    ) ENGINE=INNODB;
    
    CREATE TABLE USER (
         user_id INT, 
         user_name VARCHAR(50), 
         company_id INT,
         INDEX company_id_idx (company_id),
         FOREIGN KEY (company_id) REFERENCES COMPANY (company_id) ON...
    ) ENGINE=INNODB;
    

    를 ON UPDATE 절에서 살펴 보자 :

    그리고 지금 DELETE 측의에 :

    일반적으로 내 기본값은 다음과 같습니다 DELETE ON ON UPDATE CASCADE를 제한합니다. 트랙 테이블에 대한 DELETE CASCADE ON 일부 (로그 - 모든 logs--, 그런 것들) 마스터 테이블이 작업 테이블과 같은 외부 키를 포함하는 테이블에 대한 '단순 속성이'이고 DELETE SET NULL의 ON 사용자 테이블.

    편집하다

    내가 그 쓴 이후 오랜 시간이되었습니다. 지금은 내가 한 가지 중요한 경고를 추가한다고 생각합니다. MySQL은 폭포와 하나의 큰 문서화 된 제한이 있습니다. 캐스케이드 트리거를 해고하지 않습니다. 당신이 사용하는 트리거에 해당 엔진에 자신이 충분한 이상 인 경우에 그래서 당신은 폭포의 제약을 피해야한다.

    ==> 참조는 마지막 편집 아래의 상황이이 도메인에 이동

    그리고 나는이 언젠가는 고칠 것이라고 생각하지 않습니다. 외래 키 제약은 InnoDB 스토리지에 의해 관리되며, 트리거는 MySQL의 SQL 엔진에 의해 관리됩니다. 모두 분리된다. 이노 디비 어쩌면 그들은 스토리지 엔진 한 날에 직접 트리거를 추가, 아마거야, 제약 관리하는 유일한 스토리지입니다.

    그러나 나는 당신이 가난한 트리거 구현과 매우 유용한 외래 키 제약 지원 사이에서 선택해야하는 요소에 대한 내 자신의 의견을 가지고있다. 당신이 데이터베이스 일관성에 익숙해 있습니다 일단 당신은 PostgreSQL을 사랑합니다.

    코멘트에 @IstiaqueAhmed에 의해 명시된 바와 같이, 상황은이 주제에 변경되었습니다. 그래서 링크를 따라 (나중에 다시 변경 될 수 있습니다) 실제 최근의 상황을 확인한다.

  2. ==============================

    2.@MarkR 응답에 추가 -주의 할 점은 인식하거나 (삭제, 고유 제한 계단식 외래 키) 고급 DB 설정을 사용하지 것이다으로 ORMs와 많은 PHP 프레임 워크가 될 것이며,이 예기치 않은 동작이 발생할 수 있습니다.

    @MarkR 응답에 추가 -주의 할 점은 인식하거나 (삭제, 고유 제한 계단식 외래 키) 고급 DB 설정을 사용하지 것이다으로 ORMs와 많은 PHP 프레임 워크가 될 것이며,이 예기치 않은 동작이 발생할 수 있습니다.

    예를 들어 당신이 ORM을 사용하여 레코드를 삭제하고 DELETE CASCADE는 관련 테이블의 레코드를 삭제하는 경우, (종종 자동)이 관련 기록을 삭제하는 ORM의 시도는 오류가 발생합니다.

  3. ==============================

    3.당신은 응용 프로그램의 맥락에서이를 고려해야합니다. 일반적으로, 응용 프로그램이 아닌 데이터베이스 (데이터베이스는 단순히 응용 프로그램의 일부가되는) 설계해야합니다.

    당신은 응용 프로그램의 맥락에서이를 고려해야합니다. 일반적으로, 응용 프로그램이 아닌 데이터베이스 (데이터베이스는 단순히 응용 프로그램의 일부가되는) 설계해야합니다.

    응용 프로그램이 다양한 경우에 응답하는 방법을 고려한다.

    기본 동작은 당신이 바보 같은 프로그래밍 오류를 방지로 원하는 일반적으로 (즉하지 허가)의 동작을 제한하는 것입니다. 그러나 DELETE CASCADE에 유용 할 수 있습니다. 정말 응용 프로그램에 따라 다릅니다 당신이 어떻게 특정 개체를 삭제하려는.

    그것은 당신의 데이터 (수행로 페놀의 MyISAM를) 쓰레기하지 않기 때문에 개인적으로, 나는 그것이 FK 제약 조건을 가지고 있기 때문에보다는, 이노을 사용하십시오.

  4. from https://stackoverflow.com/questions/6720050/foreign-key-constraints-when-to-use-on-update-and-on-delete by cc-by-sa and MIT license