Oracle-11g
重命名表並創建新表後,名稱已被現有約束使用
我想知道為什麼,如果我將表名更改為不同的名稱,然後創建一個具有相同名稱的表,我會收到錯誤“名稱已被現有約束使用”。
這是創建表程式碼
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;
但是,這意味著您以後無法使用閃回恢復表。