我有一個簡單的 Oracle 表,其中已經包含資料:
CRATE NUMBER(10)
2V5 FLOAT(126)
tstamp TIMESTAMP(6)¨
我想把它轉換成這個,包括里面的資料:
CRATE NUMBER(10)
2V5 FLOAT(126)
tstamp TIMESTAMP(6) WITH TIME ZONE
我設法使用以下命令集做到了這一點:
ALTER TABLE "TIMESTAMP_DEBUG_TABLE" ADD( "temp_ts" TIMESTAMP WITH TIME ZONE );
UPDATE "TIMESTAMP_DEBUG_TABLE" SET "temp_ts" = "tstamp" AT TIME ZONE 'Europe/Zurich';
ALTER TABLE "TIMESTAMP_DEBUG_TABLE" DROP COLUMN "tstamp";
ALTER TABLE "TIMESTAMP_DEBUG_TABLE" RENAME COLUMN "temp_ts" TO "tstamp";
但是,有一個問題。oracle中每一列都有一個列id,通過運行得到:
SELECT column_id FROM USER_TAB_COLUMNS WHERE table_name = 'A' AND column_name = 'B';
我在我的軟體中使用了這個列 id,實際上我的資料庫中有另一個表,它認為它是一種外鍵。通過運行上述命令集,列 id 會被打亂,參照完整性被破壞。
我怎么解決這個問題?
有什么方法可以重新鍵入此列而不改變表的列 ID?
有沒有辦法形式化列id的關系?我可以在我的表中添加一個 FK 約束,它指向其他表的列 ids 嗎?然后我可以級聯。
任何其他想法/解決方法?
uj5u.com熱心網友回復:
一開始的依賴column_id似乎有點問題。依賴列名似乎更有意義,因為這是世界上所有其他 SQL 陳述句都有效用作鍵的內容。但我認為改變它是不可能的。
它在 I/O 和時間方面更昂貴,但您可以創建一個新表,移動資料,然后重命名它。這應該會產生一個結束狀態,其中兩個表具有相同的column_id值(假設timestamp_debug_table當前沒有添加或洗掉任何會導致column_id值亂序的列)
create table timestamp_debug_table2 (
crate number(10),
"2V5" float(126),
"tstamp" timestamp(6) with time zone
);
insert into timestamp_debug_table2
select crate, "2V5", "tstamp" at time zone 'Europe/Zurich'
from timestamp_debug_table;
drop table timestamp_debug_table;
alter table timestamp_debug_table2 rename to timestamp_debug_table;
假設您使用 12c 或更高版本,您還可以在洗掉列之前使列不可見并再次可見,這也會更改column_id值。這更有理由不依賴于類似的東西,column_id因為 Oracle 可以隨意使用它來實作其他功能。沒有人可能會猜到,執行諸如使列不可見和再次可見之類的操作會導致您的軟體停止正常作業。
ALTER TABLE "TIMESTAMP_DEBUG_TABLE" ADD( "temp_ts" TIMESTAMP WITH TIME ZONE );
UPDATE "TIMESTAMP_DEBUG_TABLE" SET "temp_ts" = "tstamp" AT TIME ZONE 'Europe/Zurich';
-- This causes the column_id in user_tab_columns to be set to NULL and "temp_ts"
-- will have a value of 3
alter table TIMESTAMP_DEBUG_TABLE
column "tstamp" invisible;
-- Now the column_id in user_tab_columns will be 4 for "tstamp". "temp_ts" will
-- still have a value of 3
alter table TIMESTAMP_DEBUG_TABLE
column "tstamp" visible;
ALTER TABLE "TIMESTAMP_DEBUG_TABLE" DROP COLUMN "tstamp";
ALTER TABLE "TIMESTAMP_DEBUG_TABLE" RENAME COLUMN "temp_ts" TO "tstamp";
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/373097.html
標籤:甲骨文
