"ON UPDATE CASCADE" 사용 시기
사용합니다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
자동으로 삭제됩니다.이것은 문제가 되지 않을 것입니다.
은 즉을 합니다.
ON UPDATE CASCADE
다음과 같은 작업을 수행합니다.id
부모님의 업데이트가 되었습니까?(1)이 참이면, 다음을 사용할 필요가 없음을 의미합니다.
ON UPDATE CASCADE
한다면parent.id
되지 않음).AUTO_INCREMENT
또는 항상 다음과 같이 설정됩니다.TIMESTAMP
이 맞습니까그래요?사실이 , 상황에서 가약만 (2)사실아라면, 는어상사합까니용야해서황다에우른떤리니이?▁other를 해야 합니까?
ON UPDATE CASCADE
?만약 내가 (어떤 이유로) 업데이트를 한다면요?
child.parent_id
존재하지 않는 것이 있다면 자동으로 삭제됩니까?
위의 질문 중 일부는 프로그래밍 방식으로 테스트하여 이해할 수 있지만 데이터베이스 공급업체에 종속된 질문이 있는지 여부도 알고 싶습니다.
빛 좀 비춰주세요.
기본 키가 ID 값만 자동으로 증분된 경우에는 다음을 실제로 사용할 수 없습니다.ON UPDATE CASCADE
.
그러나 기본 키가 10자리 UPC 바코드이며 확장 때문에 13자리 UPC 바코드로 변경해야 한다고 가정합니다. 그런경는에우,는에,ON UPDATE CASCADE
기본 키 값을 변경할 수 있으며 값에 대한 외부 키 참조가 있는 테이블도 그에 따라 변경됩니다.
#4와 관련하여 자녀 ID를 부모 테이블에 존재하지 않는 것으로 변경할 경우(그리고 참조 무결성이 있는 경우) 외부 키 오류가 발생해야 합니다.
예, 예를 들어 당신이 그렇게 한다면,
UPDATE parent SET id = 20 WHERE id = 10
으로 업데이트됩니다.외부 키가 참조하는 필드를 업데이트하지 않으면 이 설정이 필요하지 않습니다.
다른 용도는 생각할 수 없습니다.
외부 키 제약 조건이 실패할 수 있으므로 그렇게 할 수 없습니다.
당신은 요점을 거의 정확하게 파악한 것 같아요!
데이터베이스 설계 모범 사례를 따르고 기본 키를 업데이트할 수 없는 경우(어차피 항상 업데이트해야 하는 경우), 실제로 필요한 것은 없습니다.ON UPDATE CASCADE
절
Zed는 기본 키로 자연 키(예: 데이터베이스 테이블의 일반 필드)를 사용하면 기본 키를 업데이트해야 하는 특정 상황이 발생할 수 있다는 점을 잘 지적했습니다.최근의 또 다른 예는 얼마 전 10자리에서 13자리+문자로 변경된 ISBN(국제 표준 도서 번호)일 것입니다.
대리 키(예: 인위적으로 생성된 시스템)를 기본 키로 사용하기로 선택한 경우에는 그렇지 않습니다(가장 드문 경우를 제외하고는 이 키를 선호합니다).
따라서 결국 기본 키가 변경되지 않으면 다음이 필요하지 않습니다.ON UPDATE CASCADE
절
마르크
에 트리거에 며전에방문에있제었데는, 알어요냈아그걸아칠쇠가▁that,▁out▁a요어▁with'알냈▁triggers.ON UPDATE CASCADE
유용할 수 있습니다.예를 한 번 (Postgre (gre오시▁take십보 (Postgre)).SQL):
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
문제를 해결하는 열쇠였습니다.
그ON UPDATE
그리고.ON DELETE
상위 테이블의 행이 업데이트 및 삭제될 때 실행할 작업을 지정합니다.되는 동작입니다.NO ACTION
,CASCADE
,SET NULL
,그리고.SET DEFAULT
.
상위 테이블의 행 작업 삭제
상위 테이블에서 하나 이상의 행을 삭제할 경우 다음 작업 중 하나를 설정할 수 있습니다.
ON DELETE NO ACTION
SQL Server가 오류를 발생시키고 상위 테이블의 행에 대한 삭제 작업을 롤백합니다.ON DELETE CASCADE
SQL Server는 상위 테이블에서 삭제된 행에 해당하는 하위 테이블의 행을 삭제합니다.ON DELETE SET NULL
상위 테이블의 해당 행이 삭제된 경우 SQL Server는 하위 테이블의 행을 NULL로 설정합니다.이 작업을 실행하려면 외부 키 열이 null이어야 합니다.ON DELETE SET DEFAULT
SQL Server는 상위 테이블의 해당 행이 삭제된 경우 하위 테이블의 행을 기본값으로 설정합니다.이 작업을 실행하려면 외부 키 열에 기본 정의가 있어야 합니다. 경우 이 NULL입니다. null 가 능 열 기 값 입 지 기 본 NULL Server는 Server를 적용합니다.작업을 명시적으로 지정하지 않으면 작업이 없습니다.
상위 테이블의 행 업데이트 작업
상위 테이블에서 하나 이상의 행을 업데이트하는 경우 다음 작업 중 하나를 설정할 수 있습니다.
ON UPDATE NO ACTION
SQL Server가 오류를 발생시키고 상위 테이블의 행에 대한 업데이트 작업을 롤백합니다.ON UPDATE CASCADE
SQL Server는 상위 테이블의 행이 업데이트될 때 하위 테이블의 해당 행을 업데이트합니다.ON UPDATE SET NULL
상위 테이블의 해당 행이 업데이트되면 SQL Server는 하위 테이블의 행을 NULL로 설정합니다.이 작업을 실행하려면 외부 키 열이 null이어야 합니다.ON UPDATE SET DEFAULT
SQL Server는 상위 테이블의 해당 행이 업데이트된 하위 테이블의 행에 대한 기본값을 설정합니다.
FOREIGN KEY (foreign_key_columns)
REFERENCES parent_table(parent_key_columns)
ON UPDATE <action>
ON DELETE <action>;
훌륭한 질문입니다, 어제도 같은 질문이 있었습니다.저는 이 문제에 대해 생각했습니다. 특히 "ON UPDATE CASCADE"와 같은 것이 존재하는지 검색했습니다. 다행히 SQL 설계자들도 이 문제에 대해 생각했습니다.저는 테드 스트라우스의 의견에 동의하며, 노란의 사례에 대해서도 언급했습니다.
제가 언제 썼죠?테드가 지적했듯이, 한 번에 여러 개의 데이터베이스를 처리할 때, 한 테이블에서 그 중 한 데이터베이스의 수정사항은 테드가 "위성 데이터베이스"라고 부르는 어떤 종류의 복제를 가지고 있습니다. 원래의 ID로는 보관할 수 없습니다. 어떤 이유로든 새로운 데이터베이스를 만들어야 합니다.이전 데이터의 데이터를 업데이트할 수 없는 경우(예: 권한 때문에 또는 정규화의 전체 규칙에 대한 절대적이고 완전한 존중을 받을 자격이 없는 경우).
그래서 저는 두 가지 점에서 동의합니다.
(A.) 네, 대부분의 경우 더 나은 디자인은 피할 수 있습니다. 하지만
(B.) 마이그레이션, 데이터베이스 복제 또는 비상 사태 해결의 경우, 다행히도 존재하는지 검색하러 갔을 때 있었던 훌륭한 도구입니다.
제 의견은 주로 #3 지점에 대한 것입니다. 상위 키를 업데이트할 수 없다고 가정할 경우 어떤 상황에서 ON UPDATE CASCADE를 적용할 수 있습니까?여기 한 가지 사례가 있습니다.
여러 위성 데이터베이스를 마스터와 병합해야 하는 복제 시나리오를 처리하고 있습니다.각 위성은 동일한 테이블에 대한 데이터를 생성하므로 테이블을 마스터에 병합하면 고유 제약 조건을 위반하게 됩니다.병합할 때마다 키를 다시 늘리는 솔루션의 일부로 ON UPDATE CASCADE를 사용하려고 합니다.ON UPDATE CASCADE는 프로세스의 일부를 자동화하여 이 프로세스를 단순화해야 합니다.
여기서 다른 훌륭한 답변을 추가하려면 ON UPDATE CASCADE(또는 DELETE CASCADE...)를 신중하게 사용하는 것이 중요합니다.이 규격의 테이블에 대한 작업을 수행하려면 기본 관계에 대한 배타적 잠금이 필요합니다.
만약 당신이 하나의 테이블에 여러 개의 CASCADE 정의가 있고, 특히 같은 정의를 사용하는 여러 개의 테이블이 있고, 여러 사용자가 업데이트를 하고 있다면, 이것은 한 프로세스가 첫 번째 기본 테이블에 배타적 잠금을 획득하고, 다른 프로세스가 두 번째 배타적 잠금을 획득할 때 교착 상태를 만들 수 있습니다.그리고 그들 중 어느 누구도 작업을 수행하기 위해 두 개의 배타적 잠금을 모두 가질 수 없어 서로를 차단합니다.
언급URL : https://stackoverflow.com/questions/1481476/when-to-use-on-update-cascade
'programing' 카테고리의 다른 글
엑셀에서 유닉스 에포크 타임스탬프를 사람이 읽을 수 있는 날짜/시간으로 변환하려면 어떻게 해야 합니까? (0) | 2023.04.28 |
---|---|
Angular CLI SAS 옵션 (0) | 2023.04.28 |
기존 repo를 새로운 다른 리모트 repo 서버에 푸시하시겠습니까? (0) | 2023.04.23 |
.csv에서 액티브 엑셀 시트로 데이터를 Import하는 방법이 있습니까? (0) | 2023.04.23 |
python에서 openpyxl을 사용하여 새로운 세포에 쓰는 방법 (0) | 2023.04.23 |