내 테이블에 외래 키 제약 조건이 있는데 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
조항 만 수정할 수 있습니다 제약의 상태 (예 : 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;
답변
이 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;
답변
앞에서 설명한대로 :
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;
답변
MySQL을 사용하는 모든 사람 :
당신은 당신에 머리를하면 PHPMYADMIN
당신이해야 할 클릭, 당신은 업데이트 할 외래 키가있는 테이블에 웹 페이지 및 탐색 Relational view
에있는 Structure
탭과 변경 On delete
에 선택 메뉴 옵션을 Cascade
.
아래 표시된 이미지 :
답변
여기에 편리한 해결책이 있습니다! SQL Server 2008 R2를 사용하고 있습니다.
ON DELETE / UPDATE CASCADE를 추가하여 FK 제약 조건을 수정하려면 다음 단계를 수행하십시오.
숫자 1 :
구속 조건을 마우스 오른쪽 버튼으로 클릭하고 수정을 클릭하십시오.
2 번:
왼쪽에서 구속 조건을 선택하십시오 (둘 이상있는 경우). 그런 다음 오른쪽에서 ” INSERT And UPDATE Specification “지점을 축소 하고 규칙 삭제 또는 규칙 업데이트 행에서 필요에 따라 작업을 지정하십시오. 그런 다음 대화 상자를 닫습니다.
번호 3 :
마지막 단계는 이러한 수정 사항을 저장하는 것입니다 (물론!)
추신 : 다른 테이블에서 참조 된 기본 키를 수정하고 싶기 때문에 많은 작업에서 나를 구했습니다.