遷移沒有主鍵的資料表

本頁面說明如何遷移沒有主鍵的 Oracle 資料表。

自動產生主鍵總覽

沒有主鍵的資料表無法保證複製作業的一致性。資料庫遷移服務只會遷移具有主鍵的資料表。如果來源資料庫包含沒有主鍵的資料表,資料庫遷移服務可以透過下列方式處理:

  • 轉換原始碼和結構定義時,資料庫遷移服務會在目的地資料表中新增 ROWID 資料欄,自動建立任何缺少的主鍵。這項自動化程序需要來源資料表符合以下條件:
    • 尚未設定主鍵。
    • 請勿在沒有可為空值資料欄的情況下,使用 UNIQUE 限制。
    • 請勿使用沒有可為空值欄的 UNIQUE 索引。
    如果資料表不符合這些規定,您必須在轉換後的 PostgreSQL 結構定義中,手動為資料表新增缺少的主鍵。
  • 在舊版轉換工作區中,資料庫遷移服務不會自動建立主鍵。如果您使用舊版轉換工作區,則必須手動將遺漏的主鍵新增至轉換後的 PostgreSQL 結構定義資料表。

手動新增缺少的主鍵

如要遷移沒有主鍵的 Oracle 資料表,請按照下列步驟操作:

  1. 使用轉換工作區轉換原始碼和結構定義。
  2. 透過 SQL 用戶端連線至目的地 Cloud SQL 執行個體。您可以使用下列方法:
    • psql 用戶端。您可以使用這個方法連線至執行個體私人 IP,但可能需要建立 Compute Engine 虛擬機器。
    • gcloud sql connect 指令。這項指令僅適用於已啟用公開 IP 位址的 Cloud SQL 執行個體。
  3. 為資料表建立缺少的主鍵限制。如要進一步瞭解主鍵,請參閱 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 資料欄。資料庫遷移服務會使用來源 Oracle ROWID 虛擬資料欄中的對應數值填入資料欄。

    如要新增資料欄並設為主鍵,請執行下列指令:

    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。

後續步驟