Oracle-11g

重命名表並創建新表後,名稱已被現有約束使用

  • April 27, 2016

我想知道為什麼,如果我將表名更改為不同的名稱,然後創建一個具有相同名稱的表,我會收到錯誤“名稱已被現有約束使用”。

這是創建表程式碼

  create table abc
 (
      num number (4),
      name varchar2 (50),
     constraint abc primary key (num, name)
);

這是更改表程式碼

alter table abc rename to cba;

這是重新創建表的程式碼

  create table abc
 (
      num number (4),
      name varchar2 (50),
     constraint abc primary key (num, name)
);

重命名表後,還要重命名約束和索引:

alter table cba rename constraint abc to cba;
alter index abc rename to cba;

每當您在 Oracle 中創建帶有約束的表時,都會在 user_constraints 表中創建一個條目,如果約束涉及創建索引(如在本例中,主鍵約束也會創建聚集索引),還會在表上創建索引您可以找到查詢 user_indexes。

select * from user_constraints where table_name='table name';

select * from user_indexes where table_name='table_name';

您還可以使用約束名稱查詢以檢查約束是否仍然存在:

select * from user_constraints where constraint_name='abc';

select * from user_indexes where index_name='abc';

刪除表時,不會立即清除它。它駐留在資源回收筒中。因此我們有時會觀察到約束不受影響,這會導致在短時間內使用相同的約束名稱時出錯。在查詢 user_constraints 或 user_indexes 表時,您會發現表名是一些以 ‘BIN$’ 開頭的隨機字元串

因此,當錯誤彈出時,我們可能需要顯式刪除約束和索引。

另一種方法是徹底清除表:

drop table table_name purge;

但是,這意味著您以後無法使用閃回恢復表。

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