Cách thêm 'TRÊN XÓA CASCADE' trong câu lệnh ALTER TABLE


130

Tôi có một ràng buộc khóa ngoại trong bảng của mình, tôi muốn thêm BẬT XÓA CASCADE vào nó.

Tôi đã thử điều này:

thay đổi bảng child_table_name
  sửa đổi ràng buộc fk_name
  khóa ngoại (child_column_name)
  tham chiếu Parent_table_name (Parent_column_name) khi xóa tầng;

Không hoạt động.

EDIT:
Khóa ngoại đã tồn tại, có dữ liệu trong cột khóa ngoại.

Thông báo lỗi tôi nhận được sau khi thực hiện câu lệnh:

ORA-02275: một ràng buộc tham chiếu như vậy đã tồn tại trong bảng

Có vấn đề gì vậy? Tuyên bố bị từ chối, việc xóa không xảy ra ..
Thorsten

Câu trả lời:



86

Đầu tiên dropkhóa ngoại của bạn và thử lệnh trên của bạn, đặt add constraintthay vì modify constraint. Bây giờ đây là lệnh:

ALTER TABLE child_table_name 
  ADD CONSTRAINT fk_name 
  FOREIGN KEY (child_column_name) 
  REFERENCES parent_table_name(parent_column_name) 
  ON DELETE CASCADE;

24
Anh ta đưa cho chúng tôi toàn bộ mã đó là một lợi thế cho những người không liên quan gì đến hậu thế
Matthis Kohli

1
@WiiMaxx Người sáng lập một anh chàng ghen tuông. lol Câu trả lời này quan trọng hơn câu trả lời đầu tiên vì điều này cũng cung cấp mã ..
Tôi là người ngu ngốc nhất

11

PL * SQL này sẽ ghi vào DBMS_OUTPUT một tập lệnh sẽ loại bỏ từng ràng buộc không xóa tầng và tạo lại nó bằng xóa tầng.

LƯU Ý: chạy đầu ra của tập lệnh này là RỦI RO RIÊNG CỦA BẠN. Tốt nhất để đọc qua tập lệnh kết quả và chỉnh sửa nó trước khi thực hiện nó.

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;

11

Như đã giải thích trước:

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;

Như bạn có thể thấy chúng phải được tách các lệnh, trước tiên thả sau đó thêm.


Điều này không hợp lệ đối với Oracle
a_horse_with_no_name

Chỉ được thử nghiệm trong SqlServer, nhưng có thể bạn phải có cơ hội govới dấu chấm phẩy như trong postgres và chính SqlServer. Nhưng các mã cốt lõi vẫn là sql standar. Thử nghiệm với dấu chấm phẩy, tôi vừa thay đổi nó
David Silva-Barrera

Các [hoặc ]không hợp lệ trong SQL tiêu chuẩn (và Oracle). Oracle cũng không hỗ trợ on updateđiều khoản cho khóa ngoại.
a_horse_with_no_name

Bạn nói đúng, [ ]là SqlServer cụ thể. Tôi sẽ làm sạch nó nhiều hơn. Về on updatetôi không thể nói bất cứ điều gì về.
David Silva-Barrera

11

Trả lời cho NGƯỜI SỬ DỤNG 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;

Chào mừng bạn đến với StackOverflow. Vui lòng tìm hiểu về định dạng mã trong stackoverflow.com/editing-help . Tôi đã chỉnh sửa mã cho bạn để làm cho nó dễ đọc hơn.
Adrian W

3

Đối với bất cứ ai sử dụng MySQL:

Nếu bạn truy cập vào PHPMYADMINtrang web của mình và điều hướng đến bảng có khóa ngoại bạn muốn cập nhật, tất cả những gì bạn phải làm là nhấp vào Relational view vị trí trong Structuretab và thay đổi On deletetùy chọn menu chọn thànhCascade .

Hình ảnh hiển thị dưới đây:

nhập mô tả hình ảnh ở đây


OP là từ năm 2009, câu hỏi Oracle của nó được gắn thẻ và PHPMYADMIN là thành phần phần mềm của bên thứ ba cho MySQL.
ăn chay

7
Hoàn toàn đúng. Nhưng tôi đã googled cho câu hỏi này, muốn biết làm thế nào để làm điều này trong MySQL và Google đã đưa tôi đến đây. Vâng, câu hỏi được gắn thẻ với Oracle, vì vậy câu trả lời này không chính xác ... nhưng nó sẽ hữu ích cho những độc giả như chính tôi, người vấp phải Câu trả lời này. Vì vậy, nó làm tăng giá trị cho trang này, ngay cả khi nó không phải là cụ thể của Oracle. Vì vậy, cảm ơn bạn James111!
Mike Gledhill

3

Đây là một giải pháp tiện dụng! Tôi đang sử dụng SQL Server 2008 R2.

Khi bạn muốn sửa đổi ràng buộc FK bằng cách thêm BẬT XÓA / CẬP NHẬT CASCADE, hãy làm theo các bước sau:

SỐ 1:

Nhấp chuột phải vào ràng buộc và nhấp để Sửa đổi

nhập mô tả hình ảnh ở đây

SỐ 2:

Chọn ràng buộc của bạn ở phía bên trái (nếu có nhiều hơn một). Sau đó, ở phía bên phải, thu gọn điểm " Đặc tả và cập nhật " và chỉ định các hành động trên hàng Xóa quy tắc hoặc Cập nhật quy tắc cho phù hợp với nhu cầu của bạn. Sau đó, đóng hộp thoại.

nhập mô tả hình ảnh ở đây

SỐ 3:

Bước cuối cùng là lưu các sửa đổi luận án (tất nhiên!)

nhập mô tả hình ảnh ở đây

PS: Nó đã cứu tôi khỏi một loạt công việc khi tôi muốn sửa đổi khóa chính được tham chiếu trong một bảng khác.


Hoàn hảo, chính xác những gì tôi cần là tốt!
Wildview

1

Nếu bạn muốn thay đổi khóa ngoại mà không bỏ nó, bạn có thể làm:

ALTER TABLE child_table_name  WITH CHECK ADD FOREIGN KEY(child_column_name)
REFERENCES parent_table_name (parent_column_name) ON DELETE CASCADE

0
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;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.