このページでは、主キーのない Oracle テーブルを移行する方法について説明します。
主キーの自動生成では、Database Migration Service が主キーのないソーステーブルを処理する方法について説明します。
不足している主キーを手動で追加するには、変換されたスキーマで不足している主キーを追加するために使用できるクエリの例が示されています。
主キーの自動生成の概要
主キーのないテーブルでは、一貫性のあるレプリケーションは保証されません。Database Migration Service は、主キーがあるテーブルのみを移行します。移行元データベースに主キーのないテーブルが含まれている場合、Database Migration Service は次の方法で処理できます。
-
ソースコードとスキーマを変換すると、Database Migration Service は、移行先テーブルに
ROWID列を追加して、不足している主キーを自動的に作成できます。この自動プロセスでは、ソーステーブルに次の要件があります。- 主キーがまだない。
- null 可能な列がない
UNIQUE制約は設定しないでください。 - null 値を許容しない列を含む
UNIQUEインデックスがない。
- 以前の変換ワークスペースでは、Database Migration Service は主キーを自動的に作成しません。以前の変換ワークスペースを使用する場合は、変換された PostgreSQL スキーマのテーブルに欠落している主キーを手動で追加する必要があります。
欠落している主キーを手動で追加する
主キーのない Oracle テーブルを移行するには、次の操作を行います。
- コンバージョン ワークスペースを使用して、ソースコードとスキーマを変換します。
- 標準の変換ワークスペースについては、 ソースコードとスキーマを変換するをご覧ください。
- 以前のコンバージョン ワークスペースについては、 以前のコンバージョン ワークスペースを使用するをご覧ください。
-
psqlクライアントを使用して AlloyDB for PostgreSQL クラスタに接続します。 - テーブルに不足している主キー制約を作成します。主キーの詳細については、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列を追加します。Database Migration Service は、移行元の 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 に置き換えます。