Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Làm cách nào để xóa các hàng có phụ thuộc hai hướng?

Tôi phải tự hỏi làm thế nào dữ liệu của bạn ở trạng thái này ngay từ đầu, vì các khóa ngoại của bạn not null . Nếu cả hai bảng đều trống để bắt đầu, bạn sẽ không bao giờ có thể chèn một hàng vào một trong hai bảng.

Bỏ qua điều đó trong giây lát, tạo lại kịch bản của bạn, tôi không gặp vấn đề gì khi tắt các ràng buộc:

CREATE TABLE tablea(id NUMBER(19, 0) NOT NULL, 
                    rtablea_id NUMBER(19, 0) NOT NULL, 
                    PRIMARY KEY(id))
/

CREATE TABLE tableb(id NUMBER(19, 0) NOT NULL, 
                    rtableb_id NUMBER(19, 0) NOT NULL, 
                    PRIMARY KEY(id))
/

INSERT INTO tablea
VALUES     (1, 2)
/

INSERT INTO tableb
VALUES     (2, 1)
/

ALTER TABLE tablea ADD CONSTRAINT fka1 
                       FOREIGN KEY (rtablea_id)  
                       REFERENCES tableb
/
ALTER TABLE tableb ADD CONSTRAINT fkb1  
                       FOREIGN KEY (rtableb_id)  
                       REFERENCES tablea
/
ALTER TABLE tablea MODIFY CONSTRAINT fka1 DISABLE
/
ALTER TABLE tableb MODIFY CONSTRAINT fkb1 DISABLE
/
delete tablea
/
delete tableb
/
commit
/

Kết quả:

Table created.
Table created.
1 row created.
1 row created.
Table altered.
Table altered.
Table altered.
Table altered.
1 row deleted.
1 row deleted.
Commit complete.

Tôi không chắc bạn làm cách nào để nhận được ORA-02297 lỗi khi cố gắng vô hiệu hóa khóa ngoại. Lỗi đó thường thấy khi vô hiệu hóa khóa chính hoặc khóa duy nhất mà khóa ngoại dựa vào.

Tôi nghi ngờ điều bạn thực sự muốn làm là đặt các ràng buộc thành initially deferred . Điều này sẽ cho phép bạn thực hiện chèn và xóa từng bảng riêng lẻ, miễn là hàng tương ứng được cập nhật hoặc xóa trước khi giao dịch được cam kết:

CREATE TABLE tablea(id NUMBER(19, 0) NOT NULL,  
                    rtablea_id NUMBER(19, 0) NOT NULL,  
                    PRIMARY KEY(id))
/

CREATE TABLE tableb(id NUMBER(19, 0) NOT NULL,  
                    rtableb_id NUMBER(19, 0) NOT NULL,  
                    PRIMARY KEY(id))
/

ALTER TABLE tablea ADD CONSTRAINT fka1 
                       FOREIGN KEY (rtablea_id) 
                       REFERENCES tableb 
                       INITIALLY DEFERRED
/
ALTER TABLE tableb ADD CONSTRAINT fkb1 
                       FOREIGN KEY (rtableb_id) 
                       REFERENCES tablea 
                       INITIALLY DEFERRED
/

INSERT INTO tablea
VALUES     (1, 2)
/

INSERT INTO tableb
VALUES     (2, 1)
/

INSERT INTO tableb
VALUES     (3, 1)
/

COMMIT
/

DELETE tableb
WHERE  id = 2
/

UPDATE tablea
SET    rtablea_id   = 3
WHERE  id = 1
/

COMMIT
/

Kết quả:

Table created.
Table created.
Table altered.
Table altered.
1 row created.
1 row created.
1 row created.
Commit complete.
1 row deleted.
1 row updated.
Commit complete.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. [01000] [unixODBC] [Trình quản lý trình điều khiển] Không thể mở lib '/usr/local/easysoft/oracle/InstantClient112/lib/libsqora.so':không tìm thấy tệp

  2. Gọi chính xác một thủ tục được lưu trữ bằng Spring Data JPA

  3. Các biểu mẫu / ứng dụng Oracle trong Internet Explorer 8 sử dụng JInitator

  4. ORA-01034:ORACLE không khả dụng ORA-27101:vùng bộ nhớ chia sẻ không tồn tại

  5. SQL tiêu chuẩn thay thế cho Oracle DECODE