ALTER TABLE 문에 'ON DELETE CASCADE'를 추가하는 방법
테이블에 외부 키 제약 조건이 있습니다. 여기에 ON DELETE CASCADE를 추가하고 싶습니다.
나는 이것을 시도해 보았다.
테이블 변경 child_table_name제약 조건 fk_name 수정외부 키(child_column_name)삭제 캐스케이드 상의 parent_table_name(parent_column_name)을 참조합니다.
효과가 없다.
편집:
외부 키가 이미 있습니다. 외부 키 열에 데이터가 있습니다.
스테이트먼트 실행 후에 표시되는 에러 메시지:
ORA-02275: 이러한 참조 제약 조건이 테이블에 이미 있습니다.
추가할 수 없습니다.ON DELETE CASCADE기존 제약조건으로 이동합니다.해야 할 것이다drop그리고...create제약이 문서에는 다음과 같은 내용이 기재되어 있습니다.MODIFY CONSTRAINT절은 제약 조건 상태만 수정할 수 있습니다(i-e:ENABLED/DISABLED...).
첫번째drop외부 키를 누르고 위의 명령어를 사용해 보십시오.add constraint대신modify constraint다음은 명령어입니다.
ALTER TABLE child_table_name
ADD CONSTRAINT fk_name
FOREIGN KEY (child_column_name)
REFERENCES parent_table_name(parent_column_name)
ON DELETE CASCADE;
앞에서 설명한 바와 같이:
ALTER TABLE TABLENAME
drop CONSTRAINT FK_CONSTRAINTNAME;
ALTER TABLE TABLENAME
ADD CONSTRAINT FK_CONSTRAINTNAME
FOREIGN KEY (FId)
REFERENCES OTHERTABLE
(Id)
ON DELETE CASCADE ON UPDATE NO ACTION;
보시다시피 명령어를 분리해야 합니다.처음에는 드롭 후 추가합니다.
MYSQL 사용자 답변:
ALTER TABLE ChildTableName
DROP FOREIGN KEY `fk_table`;
ALTER TABLE ChildTableName
ADD CONSTRAINT `fk_t1_t2_tt`
FOREIGN KEY (`parentTable`)
REFERENCES parentTable (`columnName`)
ON DELETE CASCADE
ON UPDATE CASCADE;
이 PL*SQL은 DBMS_OUTPUT에 삭제 캐스케이드가 없는 각 제약조건을 삭제하고 삭제 캐스케이드로 다시 작성합니다.
주의: 이 스크립트의 출력은 사용자의 책임입니다.스크립트를 실행하기 전에 스크립트를 읽고 편집하는 것이 가장 좋습니다.
DECLARE
CURSOR consCols (theCons VARCHAR2, theOwner VARCHAR2) IS
select * from user_cons_columns
where constraint_name = theCons and owner = theOwner
order by position;
firstCol BOOLEAN := TRUE;
begin
-- For each constraint
FOR cons IN (select * from user_constraints
where delete_rule = 'NO ACTION'
and constraint_name not like '%MODIFIED_BY_FK' -- these constraints we do not want delete cascade
and constraint_name not like '%CREATED_BY_FK'
order by table_name)
LOOP
-- Drop the constraint
DBMS_OUTPUT.PUT_LINE('ALTER TABLE ' || cons.OWNER || '.' || cons.TABLE_NAME || ' DROP CONSTRAINT ' || cons.CONSTRAINT_NAME || ';');
-- Re-create the constraint
DBMS_OUTPUT.PUT('ALTER TABLE ' || cons.OWNER || '.' || cons.TABLE_NAME || ' ADD CONSTRAINT ' || cons.CONSTRAINT_NAME
|| ' FOREIGN KEY (');
firstCol := TRUE;
-- For each referencing column
FOR consCol IN consCols(cons.CONSTRAINT_NAME, cons.OWNER)
LOOP
IF(firstCol) THEN
firstCol := FALSE;
ELSE
DBMS_OUTPUT.PUT(',');
END IF;
DBMS_OUTPUT.PUT(consCol.COLUMN_NAME);
END LOOP;
DBMS_OUTPUT.PUT(') REFERENCES ');
firstCol := TRUE;
-- For each referenced column
FOR consCol IN consCols(cons.R_CONSTRAINT_NAME, cons.R_OWNER)
LOOP
IF(firstCol) THEN
DBMS_OUTPUT.PUT(consCol.OWNER);
DBMS_OUTPUT.PUT('.');
DBMS_OUTPUT.PUT(consCol.TABLE_NAME); -- This seems a bit of a kluge.
DBMS_OUTPUT.PUT(' (');
firstCol := FALSE;
ELSE
DBMS_OUTPUT.PUT(',');
END IF;
DBMS_OUTPUT.PUT(consCol.COLUMN_NAME);
END LOOP;
DBMS_OUTPUT.PUT_LINE(') ON DELETE CASCADE ENABLE VALIDATE;');
END LOOP;
end;
여기 편리한 해결책이 있습니다!SQL Server 2008 R2를 사용하고 있습니다.
ON DELETE/UPDATE CASCADE를 추가하여 FK 구속조건을 변경하는 절차는 다음과 같습니다.
넘버 1:
제약조건을 우클릭하여 [수정]을 클릭합니다.
넘버 2:
왼쪽에서 구속조건을 선택합니다(여러 개 있는 경우).그런 다음 오른쪽에서 "INSERT And UPDATE Specification" 지점을 축소하고 필요에 따라 규칙 삭제 또는 규칙 업데이트 행에 작업을 지정합니다.그런 다음 대화 상자를 닫습니다.
넘버 3:
마지막 단계는 수정 내용을 저장하는 것입니다(물론입니다).
PS: 다른 표에서 참조되고 있는 프라이머리 키를 수정하고 싶기 때문에 많은 작업으로부터 해방되었습니다.
MySQL을 사용하는 모든 사용자:
만약 당신이 그쪽으로 향한다면PHPMYADMIN갱신할 외부 키가 있는 테이블로 이동합니다.이때 해야 할 일은Relational view 에 Structure을 을 변경합니다.On delete[ ]에서 [Select]를 합니다.Cascade.
아래 이미지:
외부 키를 삭제하지 않고 변경할 경우 다음을 수행할 수 있습니다.
ALTER TABLE child_table_name WITH CHECK ADD FOREIGN KEY(child_column_name)
REFERENCES parent_table_name (parent_column_name) ON DELETE CASCADE
postgresql의 경우
BEGIN TRANSACTION ;
ALTER TABLE bank_accounts
DROP CONSTRAINT bank_accounts_company_id_fkey;
ALTER TABLE bank_accounts
ADD CONSTRAINT bank_accounts_company_id_fkey FOREIGN KEY (company_id)
REFERENCES companies (id)
ON DELETE CASCADE;
END;
ALTER TABLE `tbl_celebrity_rows` ADD CONSTRAINT `tbl_celebrity_rows_ibfk_1` FOREIGN KEY (`celebrity_id`)
REFERENCES `tbl_celebrities`(`id`) ON DELETE CASCADE ON UPDATE RESTRICT;
MySQL workbench img 변경할 테이블을 마우스 오른쪽 버튼으로 클릭하고 테이블 변경을 클릭한 다음 외부 키를 클릭합니다.오른쪽에 [외부 키 옵션]이 표시되고 [cascade]를 선택하고 [적용]을 클릭하기만 하면 됩니다!
언급URL : https://stackoverflow.com/questions/1571581/how-to-add-on-delete-cascade-in-alter-table-statement
'programing' 카테고리의 다른 글
| MUI에서의 응답 타이포그래피? (0) | 2023.03.15 |
|---|---|
| 이너 조인은 에퀴 조인과 같은 건가요? (0) | 2023.03.15 |
| AngularJS 페이지 내 여러 ng-app (0) | 2023.03.15 |
| 뷰포트 방향 감지(방향이 세로 방향인 경우) 사용자에게 지침을 알리는 경보 메시지 표시 (0) | 2023.03.15 |
| 후크 사용 시 React batch state update가 기능합니까? (0) | 2023.03.15 |



