本頁說明如何遷移沒有主鍵的 Oracle 資料表。
自動產生主鍵總覽
沒有主鍵的資料表無法保證複製作業的一致性。資料庫遷移服務只會遷移含有主鍵的資料表。如果來源資料庫包含沒有主鍵的資料表,資料庫遷移服務可以透過下列方式處理:
-
轉換來源程式碼和結構定義時,資料庫遷移服務會在目標資料表中新增
ROWID資料欄,自動建立任何遺失的主鍵。這項自動化程序需要來源資料表符合下列條件:- 沒有主鍵。
- 沒有可為空值的資料欄,因此沒有
UNIQUE限制。 - 沒有
UNIQUE索引,且沒有可為空值的資料欄。
- 在舊版轉換工作區中,資料庫遷移服務不會自動建立主鍵。如果您使用舊版轉換工作區,則需要手動將缺少的主鍵新增至轉換後的 PostgreSQL 結構定義中的資料表。
手動新增缺少的主鍵
如要遷移沒有主鍵的 Oracle 資料表,請按照下列步驟操作:
- 使用轉換工作區轉換來源程式碼和結構定義。
- 如為標準轉換工作區,請參閱「 轉換來源程式碼和結構定義」。
- 如要瞭解舊版轉換工作區,請參閱「 使用舊版轉換工作區」。
- 使用 SQL 用戶端連線至目的地 Cloud SQL 執行個體。你可以使用下列方法:
-
psqlclient。您可以使用這個方法連線至執行個體私人 IP,但可能需要建立 Compute Engine 虛擬機器。 -
gcloud sql connect指令。這個指令僅適用於已啟用公開 IP 位址的 Cloud SQL 執行個體。
-
- 為資料表建立缺少的主鍵限制。如要進一步瞭解主鍵,請參閱 PostgreSQL 說明文件中的「
主鍵」。
您也可以展開下列章節,查看 SQL 指令範例:
使用現有資料欄建立主鍵
您的資料表可能已根據資料欄或資料欄組合,設定邏輯主鍵。舉例來說,可能會有設定了唯一限制或索引的資料欄。使用這些資料欄,為來源資料庫中的資料表產生新的主鍵。例如:
ALTER TABLE TABLE_NAME ADD PRIMARY KEY (COLUMN_NAME);
更改下列內容:
- TABLE_NAME,其中包含沒有主鍵的資料表名稱。
- COLUMN_NAME,其中包含具有唯一限制或索引的資料欄名稱,可用做主鍵。
使用所有資料欄建立主鍵
如果沒有可做為主鍵的預先存在限制,請使用資料表的所有欄建立主鍵。請確認主鍵長度未超過 PostgreSQL 執行個體允許的上限。
以這種方式建立複合主鍵時,您需要明確列出要使用的所有資料欄名稱。您無法使用陳述式擷取所有資料欄名稱。例如:
ALTER TABLE TABLE_NAME ADD PRIMARY KEY (COLUMN_NAME_1, COLUMN_NAME_2, COLUMN_NAME_3, ...);
更改下列內容:
- TABLE_NAME,其中包含沒有主鍵的資料表名稱。
- COLUMN_NAME_1、COLUMN_NAME_2 等,並以半形逗號分隔,這些是您要用來建立主鍵的資料欄名稱。
使用
ROWID虛擬資料欄建立唯一限制Oracle 資料庫會使用
ROWID虛擬資料欄,儲存資料表中每列的位置。如要遷移沒有主鍵的 Oracle 資料表,可以在目的地 PostgreSQL 資料庫中新增ROWID資料欄。資料庫遷移服務會從來源 OracleROWID虛擬資料欄填入對應的數值。如要新增資料欄並設為主鍵,請執行下列指令:
ALTER TABLE TABLE_NAME ADD COLUMN rowid numeric(33,0) NOT NULL; CREATE SEQUENCE TABLE_NAME_rowid_seq INCREMENT BY -1 START WITH -1 OWNED BY TABLE_NAME.rowid; ALTER TABLE TABLE_NAME ALTER COLUMN rowid SET DEFAULT nextval('TABLE_NAME_rowid_seq'); ALTER TABLE TABLE_NAME ADD CONSTRAINT CONSTRAINT_DISPLAY_NAME PRIMARY KEY (rowid);
更改下列內容:
- TABLE_NAME,並將其替換為要新增資料欄的資料表名稱。
- CONSTRAINT_DISPLAY_NAME 是
PRIMARY KEY限制的 ID。