遷移沒有主鍵的資料表

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

自動產生主鍵總覽

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

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

手動新增缺少的主鍵

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

  1. 使用轉換工作區轉換來源程式碼和結構定義。
  2. 使用 SQL 用戶端連線至目的地 Cloud SQL 執行個體。你可以使用下列方法:
    • psql client。您可以使用這個方法連線至執行個體私人 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_1COLUMN_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_NAMEPRIMARY KEY 限制的 ID。

後續步驟