"ON UPDATE CASCADE"를 사용하는 경우


420

"ON DELETE CASCADE"를 정기적으로 사용하지만 어떤 상황에서 유용 할 지 확신 할 수 없으므로 "ON UPDATE CASCADE"를 사용하지 않습니다.

논의를 위해 코드를 보자.

CREATE TABLE parent (
    id INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (id)
);

CREATE TABLE child (
    id INT NOT NULL AUTO_INCREMENT, parent_id INT,
    INDEX par_ind (parent_id),
    FOREIGN KEY (parent_id)
        REFERENCES parent(id)
        ON DELETE CASCADE
);

"ON DELETE CASCADE"의 경우 부모가있는 부모를 id삭제하면 자식이있는 레코드 parent_id = parent.id가 자동으로 삭제됩니다. 문제 없습니다.

  1. 이것은 "ON UPDATE CASCADE"가 id부모가 업데이트 될 때 동일한 작업을 수행한다는 것을 의미 합니까?

  2. (1)이 true 인 경우 "ON UPDATE CASCADE"를 parent.id업데이트 할 수없는 경우 ( AUTO_INCREMENT또는 항상로 설정 한 경우) 업데이트 할 수없는 경우 "ON UPDATE CASCADE"를 사용할 필요가 없음을 의미 합니다 TIMESTAMP. 맞습니까?

  3. (2)가 맞지 않으면, 어떤 다른 상황에서 "ON UPDATE CASCADE"를 사용해야합니까?

  4. child.parent_id존재하지 않는 것으로 업데이트 (어떤 이유로) 하면 자동으로 삭제됩니까?

글쎄, 위의 질문 중 일부는 프로그래밍 방식으로 이해하기 위해 테스트 할 수 있지만 데이터베이스 공급 업체에 의존하는지 여부를 알고 싶습니다.

약간의 빛을 비추십시오.


답변:


468

기본 키가 자동으로 증가 된 ID 값인 경우 ON UPDATE CASCADE를 실제로 사용하지 않을 것입니다.

그러나 기본 키가 10 자리 UPC 바코드이고 확장으로 인해 13 자리 UPC 바코드로 변경해야한다고 가정 해 봅시다. 이 경우 ON UPDATE CASCADE를 사용하면 기본 키 값을 변경할 수 있으며 값에 대한 외래 키 참조가있는 테이블이 그에 따라 변경됩니다.

# 4를 참조하면 자식 ID를 부모 테이블에없는 것으로 변경하고 참조 무결성이있는 경우 외래 키 오류가 발생합니다.


6
ON UPDATE CASCADE자동 증분 키를 사용하지 않는 이전 테이블에서 기본 키를 업데이트 하기 위해 저 자신을 사용해야했습니다
BlueRaja-Danny Pflughoeft

86
  1. 예, 예를 들어 UPDATE parent SET id = 20 WHERE id = 10모든 하위 항목 을 수행 하면 parent_id가 10 인 경우에도 20으로 업데이트됩니다.

  2. 외래 키가 참조하는 필드를 업데이트하지 않으면이 설정이 필요하지 않습니다

  3. 다른 용도로는 생각할 수 없습니다.

  4. 외래 키 제약 조건이 실패하기 때문에 그렇게 할 수 없습니다.


29

나는 당신이 요점을 거의 못 박았다고 생각합니다!

데이터베이스 디자인 모범 사례를 따르고 기본 키를 업데이트 할 수없는 경우 (항상 그래야한다고 생각되는 경우)에는 ON UPDATE CASCADE절이 필요하지 않습니다 .

Zed 는 기본 키로 자연 키 (예 : 데이터베이스 테이블의 일반 필드) 를 사용하는 경우 기본 키를 업데이트해야하는 특정 상황이있을 수 있다고 지적했습니다. 최근의 또 다른 예는 ISBN (International Standard Book Numbers)으로, 얼마 전에 10 자리에서 13 자리 숫자로 변경되었습니다.

대리 사용을 선택한 경우에는 그렇지 않습니다. (예 : 인공적으로 시스템에서 생성 된) 키를 기본 키 (가장 드문 경우를 제외하고 가장 선호하는 선택) .

결국 기본 키가 변경되지 않으면 ON UPDATE CASCADE절이 필요하지 않습니다 .

마크


"인공 시스템 생성"키란 무엇입니까? UUID?
HPWD

1
@HPWD : 시스템에 의해 생성 된 "인공"키 (실제 데이터를 기반으로하거나 파생되지 않은 값)-GUID , INT 또는 BIGINT 일 수 있습니다 . 상관 없습니다. 요점은 : 그 가치는 실제 데이터와 전혀 관련이 없으며 시스템이 그 가치를 자동으로 생성하는 것입니다.
marc_s

@ marc-s 작성해 주셔서 감사합니다. 당신의 대답은 완벽했습니다.
HPWD

2
자연 키가있는 단일 열 테이블은 내 의견으로는 (최소한 MySQL DB 버전에서는) 열거 형을 대신하는 좋은 방법입니다. 예를 들어, 테이블 고려 colorsblue, purple, yellow, 및 테이블 products로모그래퍼 product_color받는 FK'ed되는 열 colors테이블. 열거 형과 같은 선택을 제한하지만 자동 증가 정수와 달리 색상 이름을 얻기 위해 조인이 필요하지 않습니다. 이 경우 대신 호출해야한다고 on update cascade결정하는 purple것이 violet좋습니다.
okdewit

18

며칠 전에 나는 방아쇠에 문제가 있었고, 그것이 ON UPDATE CASCADE유용 할 수 있다는 것을 알았습니다 . 이 예제를 살펴보십시오 (PostgreSQL).

CREATE TABLE club
(
    key SERIAL PRIMARY KEY,
    name TEXT UNIQUE
);

CREATE TABLE band
(
    key SERIAL PRIMARY KEY,
    name TEXT UNIQUE
);

CREATE TABLE concert
(
    key SERIAL PRIMARY KEY,
    club_name TEXT REFERENCES club(name) ON UPDATE CASCADE,
    band_name TEXT REFERENCES band(name) ON UPDATE CASCADE,
    concert_date DATE
);

내 문제에서는 콘서트 테이블을 업데이트하기 위해 추가 작업 (트리거)을 정의해야했습니다. 이러한 작업은 club_name 및 band_name을 수정해야했습니다. 나는 참조 때문에 그것을 할 수 없었다. 콘서트를 수정 한 다음 클럽과 밴드 테이블을 처리 할 수 ​​없었습니다. 다른 방법으로는 할 수 없었습니다. ON UPDATE CASCADE문제를 해결하는 열쇠였습니다.


3
좋은 의견. 업데이트 캐스케이드에서도 유용합니다. 어쨌든 ID를 변경해야합니다. 또한 다른 사람들도이 변경이 그렇게 일반적이지 않아야한다는 데 동의합니다. 예를 들어, 인용하는 경우 대량의 데이터에서 텍스트 필드를 사용하는 외래 키와 관련하여 데이터베이스 엔진의 성능이 가장 빠르지 않을 수 있다고 생각합니다. 콘서트 테이블의 외부 관계가 club.SERIAL 및 band.SERIAL을 사용하는 경우 이름 변경은 테이블 간의 관계에 영향을 미치지 않습니다. 그러나 ON UPDATE CASCADE는 응급 상황을 해결하는 데 유용한 도구입니다. 안부
David L

4
그러나 이것은 의심스러운 디자인이지만 다소 유서 깊은 예가됩니다. 두 유지의 핵심 기능 SERIAL에 열을 club하고 band당신이 참조하는 경우 기본 키로 name대신 각 테이블의 기본 키들?
sm

즉, 다른 테이블에서 필드를 복제하고 최신 상태 여야하는 경우에 유용합니다.
Kamil Tomšík

4

내 의견은 주로 포인트 # 3을 참조합니다 : 부모 키를 업데이트 할 수 없다고 가정하면 ON UPDATE CASCADE는 어떤 상황에서 적용됩니까? 한 가지 경우가 있습니다.

여러 위성 데이터베이스를 마스터와 병합 해야하는 복제 시나리오를 다루고 있습니다. 각 위성은 동일한 테이블에서 데이터를 생성하므로 테이블을 마스터에 병합하면 고유성 제약 조건이 위반됩니다. 병합 할 때마다 키를 다시 증가시키는 솔루션의 일부로 ON UPDATE CASCADE를 사용하려고합니다. UPDATE CASCADE는 프로세스의 일부를 자동화하여이 프로세스를 단순화해야합니다.


3

훌륭한 질문입니다. 어제 같은 질문이있었습니다. "ON UPDATE CASCADE"와 같은 것이 있으면이 문제, 특히 SEARCHED에 대해 생각했고 다행히도 SQL 디자이너도 그것에 대해 생각했습니다. 나는 Ted.strauss에 동의하며 Noran의 사례에 대해서도 언급했다.

언제 사용 했습니까? 테드가 지적한 것처럼, 한 번에 여러 데이터베이스를 처리 할 때 하나의 테이블에서 하나의 수정으로 테드가 "위성 데이터베이스"라고 부르는 것에 어떤 종류의 재생산이 있더라도 원래의 상태로 유지할 수 없습니다. ID, 그리고 어떤 이유로 든 이전 데이터에 대한 데이터를 업데이트 할 수없는 경우 (예 : 권한으로 인해 또는 일시적인 경우에 빠른 검색을하는 경우) 전체 정규화 규칙을 절대적으로 존중할 필요는 없습니다. 단순히 매우 짧은 수명의 유틸리티이기 때문입니다)

따라서 두 가지 점에 동의합니다.

(A.) 그렇습니다. 더 좋은 디자인은 그것을 피할 수 있습니다. 그러나

(B.) 마이그레이션, 데이터베이스 복제 또는 응급 상황 해결의 경우 운 좋게도 검색을했을 때 존재했던 훌륭한 도구입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.