Oracle

SQL 錯誤:OA-12991 - 刪除所有引用的多列約束後無法刪除列

  • January 12, 2022

我是 Oracle DB 的新手,需要一些幫助。我想刪除一個特定的列,但我收到了一個特定的錯誤。問題具體是:

SQL 錯誤:ORA-12991:列是多列約束中的引用原因:試圖刪除由某些約束引用的列操作:刪除引用已刪除列的所有約束或在語句中指定 CASCADE CONSTRAINTS。

所以我繼續搜尋所有引用該列的約束,方法是:

SELECT * FROM USER_TAB_COLS WHERE COLUMN_NAME = ‘My_Column_Name’

在找到並刪除我想要刪除的列上的所有引用約束後,我嘗試再次刪除該列,但我仍然遇到同樣的問題。在發布問題之前,我確實花了一些時間進行研究,並閱讀了這可能是一個“補充日誌記錄”問題。同樣,我對 oracle DB 程式非常陌生,因此有人可以對此有所了解,並可能建議在暫時刪除引用我要刪除的列的約束後,我如何以及為什麼不能刪除該列?提前致謝!

PS:使用級聯約束我個人認為不會解決問題,我也不想在不知道哪些約束被刪除的情況下刪除所有約束。所以這對我來說不是一個可行的解決方案。

設置:

create table t3 (c1 number, c2 number);
alter table t3 add  supplemental log group sl1 (c1, c2) always;
alter table t3 add constraint t3_uk unique (c1, c2);
insert into t3 values (1, 2);
commit;

嘗試刪除列:

SQL> alter table t3 drop column c2;
alter table t3 drop column c2
                          *
ERROR at line 1:
ORA-12991: column is referenced in a multi-column constraint

到目前為止一切順利,按預期進行。刪除約束:

SQL> alter table t3 drop constraint t3_uk;

Table altered.

SQL> alter table t3 drop column c2;
alter table t3 drop column c2
                          *
ERROR at line 1:
ORA-12991: column is referenced in a multi-column constraint

還是不行,同樣的錯誤。檢查補充日誌組:

select * from user_log_groups where table_name = 'T3'

OWNER LOG_GROUP_NAME TABLE_NAME LOG_GROUP_TYPE      ALWAYS      GENERATED
----- -------------- ---------- ------------------- ----------- --------------
BP    SL1            T3         USER LOG GROUP      ALWAYS      USER NAME

刪除補充日誌組,然後再次嘗試刪除該列:

SQL> alter table t3 drop supplemental log group sl1;

Table altered.

SQL> alter table t3 drop column c2;

Table altered.

引用自:https://dba.stackexchange.com/questions/134714