0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS DMSでOracleの主キーをUPDATEしたときの挙動を調べてみた

0
Last updated at Posted at 2026-02-07

背景・目的

Oracleでは主キーの更新が仕様的に許されているようです。DMSでOracleを指定したとき、どのような挙動になるか気になったので試してみます。

まとめ

DMS 3.5.4 で検証した結果、ドキュメントに記載されている「数値型主キーのバッチ更新はサポートされない」という制限は確認できず、単一行更新・バッチ更新ともに正常にCDC連携された。

概要

まずは、ドキュメントを確認してみます。下記のように、主キーのバッチ更新についてサポートされていない旨が言及されています。そもそも数値型や文字列型の単一行更新はどうなのか気になりました。そこで検証してみます。

During change data capture (CDC), AWS DMS does not support batch updates to numeric columns defined as a primary key.

AWS DMS does not support certain UPDATE commands. The following example is an unsupported UPDATE command.

UPDATE TEST_TABLE SET KEY=KEY+1;

Here, TEST_TABLE is the table name and KEY is a numeric column defined as a primary key.

実践

DMS 3.5.4 / Oracle 19の組み合わせで検証。他のバージョンでは検証結果が変わる可能性があります

下記の構成で確認します。

コンポーネント 環境
Source database RDS for Oracle 19.0.0.0
DMS DMS 3.5.4 / dms.t3.medium
Target database Aurora PostgreSQL 16.9

下記を検証します。

  • エラーや警告が表示されないか
  • 単独で更新できるか
  • DMS連携できるか
検証内容 DMSの使用 結果
Oracleで数値型の主キーを更新できるか - 更新可
Oracleで文字列型の主キーを更新できるか - 更新可
PostgreSQLで数値型の主キーを更新できるか - 更新可
PostgreSQLで文字列型の主キーを更新できるか - 更新可
Oracleで数値型の主キーを更新したら、DMSでAuroraに連携できるか Yes 連携可
Oracleで文字列の主キーを更新したら、DMSでAuroraに連携できるか Yes 連携可
Oracleで数値型の主キーをバッチ更新したら、DMSでAuroraに連携できるか Yes 連携可

事前準備

Oracle側

数値型検証用

1.数値型検証用のテーブル作成します

SQL>
SQL> -- 検証用テーブル: 数値型主キー
CREATE TABLE TEST_PK_NUMERIC (
    ID NUMBER(10) PRIMARY KEY,
    NAME VARCHAR2(100),
    CREATED_AT DATE DEFAULT SYSDATE
);
SQL>   2    3    4    5
表が作成されました。

2.テーブル定義と主キーを確認します

SQL> desc TEST_PK_NUMERIC
 名前                                    NULL?    
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER(10)
 NAME                                               VARCHAR2(100)
 CREATED_AT                                         DATE

SQL>

SQL> -- TEST_PK_NUMERIC の主キー確認
SELECT cols.column_name, cols.data_type
FROM all_constraints cons
JOIN all_cons_columns cc ON cons.owner = cc.owner AND cons.constraint_name = cc.constraint_name
JOIN all_tab_columns cols ON cc.owner = cols.owner AND cc.table_name = cols.table_name AND cc.column_name = cols.column_name
WHERE cons.constraint_type = 'P' AND cons.owner = 'XXXX' AND cons.table_name = 'TEST_PK_NUMERIC';SQL>   2    3    4    5

COLUMN_NAME                                                                                                                      DATA_TYPE
-------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------
ID                                                                                                                               NUMBER

SQL>

3.データ登録します

SQL> INSERT INTO TEST_PK_NUMERIC (ID, NAME) VALUES (1, 'テストデータ1');
INSERT INTO TEST_PK_NUMERIC (ID, NAME) VALUES (2, 'テストデータ2');
INSERT INTO TEST_PK_NUMERIC (ID, NAME) VALUES (3, 'テストデータ3');
COMMIT;
1行が作成されました。

SQL>
1行が作成されました。

SQL>
1行が作成されました。

SQL>

コミットが完了しました。

SQL>

4.データを確認します

SQL> l
  1* SELECT * FROM TEST_PK_NUMERIC ORDER BY ID
SQL> /

        ID NAME                                                                                                 CREATED_
---------- ---------------------------------------------------------------------------------------------------- --------
         1 テストデータ1                                                                                        26-02-07
         2 テストデータ2                                                                                        26-02-07
         3 テストデータ3                                                                                        26-02-07

SQL>

文字列型検証用

1.文字列型検証用のテーブル作成します

SQL>
SQL>
SQL>
SQL> -- 検証用テーブル: 文字列型主キー
CREATE TABLE TEST_PK_VARCHAR (
    ID VARCHAR2(20) PRIMARY KEY,
    NAME VARCHAR2(100),
    CREATED_AT DATE DEFAULT SYSDATE
);
SQL>   2    3    4    5
表が作成されました。

SQL>
SQL>

2.テーブル定義と主キーを確認します

SQL> desc TEST_PK_VARCHAR
 名前                                                                                  NULL?    
 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 ID      NOT NULL VARCHAR2(20)
 NAME                                                                                                                                                                                                             VARCHAR2(100)
 CREATED_AT                                                                                                                                                                                                       DATE

SQL>


SQL> SELECT column_name, data_type FROM all_tab_columns WHERE owner = 'XXXX' AND table_name = 'TEST_PK_NUMERIC';

COLUMN_NAME                                                                                                                      DATA_TYPE
-------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------
ID                                                                                                                               NUMBER
NAME                                                                                                                             VARCHAR2
CREATED_AT                                                                                                                       DATE

SQL>
SQL>


SQL> -- TEST_PK_VARCHAR の主キー確認
SELECT cols.column_name, cols.data_type
FROM all_constraints cons
JOIN all_cons_columns cc ON cons.owner = cc.owner AND cons.constraint_name = cc.constraint_name
JOIN all_tab_columns cols ON cc.owner = cols.owner AND cc.table_name = cols.table_name AND cc.column_name = cols.column_name
WHERE cons.constraint_type = 'P' AND cons.owner = 'XXXX' AND cons.table_name = 'TEST_PK_VARCHAR';SQL>   2    3    4    5

COLUMN_NAME                                                                                                                      DATA_TYPE
-------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------
ID                                                                                                                               VARCHAR2

SQL>

3.データ登録します

SQL> -- テストデータ投入: 文字列型
INSERT INTO TEST_PK_VARCHAR (ID, NAME) VALUES ('A001', 'テストデータA');
INSERT INTO TEST_PK_VARCHAR (ID, NAME) VALUES ('A002', 'テストデータB');
INSERT INTO TEST_PK_VARCHAR (ID, NAME) VALUES ('A003', 'テストデータC');
COMMIT;
SQL>
1行が作成されました。

SQL>
1行が作成されました。

SQL>
1行が作成されました。

SQL>
コミットが完了しました。

SQL>
SQL>

4.データを確認します

SQL> SELECT * FROM TEST_PK_VARCHAR ORDER BY ID;

ID                   NAME                                                                                                 CREATED_
-------------------- ---------------------------------------------------------------------------------------------------- --------
A001                 テストデータA                                                                                        26-02-07
A002                 テストデータB                                                                                        26-02-07
A003                 テストデータC                                                                                        26-02-07

SQL>

PostgreSQL側

数値型検証用

1.数値型検証用のテーブルを作成します

=> -- 検証用テーブル: 数値型主キー
CREATE TABLE test_pk_numeric (
    id BIGINT PRIMARY KEY,
    name VARCHAR(100),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE

2.テーブル定義と主キーを確認します

=> SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'test_pk_numeric';
 column_name |          data_type
-------------+-----------------------------
 id          | bigint
 created_at  | timestamp without time zone
 name        | character varying
(3 rows)

=>

=> -- test_pk_numeric
SELECT kcu.column_name, c.data_type
FROM information_schema.table_constraints tc
JOIN information_schema.key_column_usage kcu ON tc.constraint_name = kcu.constraint_name
JOIN information_schema.columns c ON kcu.table_name = c.table_name AND kcu.column_name = c.column_name
WHERE tc.constraint_type = 'PRIMARY KEY' AND tc.table_name = 'test_pk_numeric';
 column_name | data_type
-------------+-----------
 id          | bigint
(1 row)

=>

3.データ登録します

=> INSERT INTO test_pk_numeric (id, name) VALUES (1, 'テストデータ1');
INSERT INTO test_pk_numeric (id, name) VALUES (2, 'テストデータ2');
INSERT INTO test_pk_numeric (id, name) VALUES (3, 'テストデータ3');
INSERT 0 1
INSERT 0 1
INSERT 0 1
=>

4.データを確認します

=> SELECT * FROM test_pk_numeric ORDER BY id;
 id |     name      |         created_at
----+---------------+----------------------------
  1 | テストデータ1 | 2026-02-07 03:45:31.112746
  2 | テストデータ2 | 2026-02-07 03:45:31.119776
  3 | テストデータ3 | 2026-02-07 03:45:31.124288
(3 rows)

=>

文字列型検証用

1.文字列型検証用のテーブルを作成します

=> -- 検証用テーブル: 文字列型主キー
CREATE TABLE test_pk_varchar (
    id VARCHAR(20) PRIMARY KEY,
    name VARCHAR(100),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE
=>

2.テーブル定義と主キーを確認します

=> SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'test_pk_varchar';
 column_name |          data_type
-------------+-----------------------------
 created_at  | timestamp without time zone
 id          | character varying
 name        | character varying
(3 rows)

=>
=> -- test_pk_varchar
SELECT kcu.column_name, c.data_type
FROM information_schema.table_constraints tc
JOIN information_schema.key_column_usage kcu ON tc.constraint_name = kcu.constraint_name
JOIN information_schema.columns c ON kcu.table_name = c.table_name AND kcu.column_name = c.column_name
WHERE tc.constraint_type = 'PRIMARY KEY' AND tc.table_name = 'test_pk_varchar';
 column_name |     data_type
-------------+-------------------
 id          | character varying
(1 row)

=>

3.データ登録します

=> INSERT INTO test_pk_varchar (id, name) VALUES ('A001', 'テストデータA');
INSERT INTO test_pk_varchar (id, name) VALUES ('A002', 'テストデータB');
INSERT INTO test_pk_varchar (id, name) VALUES ('A003', 'テストデータC');
INSERT 0 1
INSERT 0 1
INSERT 0 1
=>

4.データを確認します

=> SELECT * FROM test_pk_varchar ORDER BY id;
  id  |     name      |         created_at
------+---------------+----------------------------
 A001 | テストデータA | 2026-02-07 03:47:14.112257
 A002 | テストデータB | 2026-02-07 03:47:14.117366
 A003 | テストデータC | 2026-02-07 03:47:14.121746
(3 rows)

=>

検証

データベース単体

Oracleで数値型の主キーを更新できるか

1.事前確認します

SQL> desc TEST_PK_NUMERIC
 名前                                                                                  NULL?    
 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 ID      NOT NULL NUMBER(10)
 NAME                                                                                                                                                                                                             VARCHAR2(100)
 CREATED_AT                                                                                                                                                                                                       DATE

SQL>


SQL> SELECT * FROM TEST_PK_NUMERIC ORDER BY ID;

        ID NAME                                                                                                 CREATED_
---------- ---------------------------------------------------------------------------------------------------- --------
         1 テストデータ1                                                                                        26-02-07
         2 テストデータ2                                                                                        26-02-07
         3 テストデータ3                                                                                        26-02-07

SQL>

2.主キーを更新します

SQL> UPDATE TEST_PK_NUMERIC SET ID = 10 WHERE ID = 1;

1行が更新されました。

SQL> commit;

コミットが完了しました。

3.更新されました

SQL> SELECT * FROM TEST_PK_NUMERIC ORDER BY ID;

        ID NAME                                                                                                 CREATED_
---------- ---------------------------------------------------------------------------------------------------- --------
         2 テストデータ2                                                                                        26-02-07
         3 テストデータ3                                                                                        26-02-07
        10 テストデータ1                                                                                        26-02-07

SQL>

Oracleで文字列型の主キーを更新できるか

1.事前確認します

SQL> desc TEST_PK_VARCHAR
 名前                                                                                  NULL?    
 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 ID      NOT NULL VARCHAR2(20)
 NAME                                                                                                                                                                                                             VARCHAR2(100)
 CREATED_AT                                                                                                                                                                                                       DATE

SQL>

SQL> SELECT * FROM TEST_PK_VARCHAR ORDER BY ID;

ID                   NAME                                                                                                 CREATED_
-------------------- ---------------------------------------------------------------------------------------------------- --------
A001                 テストデータA                                                                                        26-02-07
A002                 テストデータB                                                                                        26-02-07
A003                 テストデータC                                                                                        26-02-07

SQL>

2.主キーを更新します

SQL> UPDATE TEST_PK_VARCHAR SET ID = 'B001' WHERE ID = 'A001';

1行が更新されました。

SQL> commit;

コミットが完了しました。

SQL>

3.更新されました

SQL> SELECT * FROM TEST_PK_VARCHAR ORDER BY ID;

ID                   NAME                                                                                                 CREATED_
-------------------- ---------------------------------------------------------------------------------------------------- --------
A002                 テストデータB                                                                                        26-02-07
A003                 テストデータC                                                                                        26-02-07
B001                 テストデータA                                                                                        26-02-07

SQL>

PostgreSQLで数値型の主キーを更新できるか

1.事前確認します

=> SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'test_pk_numeric';
 column_name |          data_type
-------------+-----------------------------
 id          | bigint
 created_at  | timestamp without time zone
 name        | character varying
(3 rows)

=>

=> SELECT * FROM test_pk_numeric ORDER BY id;
 id |     name      |         created_at
----+---------------+----------------------------
  1 | テストデータ1 | 2026-02-07 03:45:31.112746
  2 | テストデータ2 | 2026-02-07 03:45:31.119776
  3 | テストデータ3 | 2026-02-07 03:45:31.124288
(3 rows)

=>

2.主キーを更新します

=> UPDATE test_pk_numeric SET id = 10 WHERE id = 1;
UPDATE 1
=>

3.更新されました

=> SELECT * FROM test_pk_numeric ORDER BY id;
 id |     name      |         created_at
----+---------------+----------------------------
  2 | テストデータ2 | 2026-02-07 03:45:31.119776
  3 | テストデータ3 | 2026-02-07 03:45:31.124288
 10 | テストデータ1 | 2026-02-07 03:45:31.112746
(3 rows)

=>

PostgreSQLで文字列型の主キーを更新できるか

1.事前確認します

=> SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'test_pk_varchar';
 column_name |          data_type
-------------+-----------------------------
 created_at  | timestamp without time zone
 id          | character varying
 name        | character varying
(3 rows)

=> SELECT * FROM test_pk_varchar ORDER BY id;
  id  |     name      |         created_at
------+---------------+----------------------------
 A001 | テストデータA | 2026-02-07 03:47:14.112257
 A002 | テストデータB | 2026-02-07 03:47:14.117366
 A003 | テストデータC | 2026-02-07 03:47:14.121746
(3 rows)

=>

2.主キーを更新します

=> UPDATE test_pk_varchar SET id = 'B001' WHERE id = 'A001';
UPDATE 1
=>

3.更新されました

=> SELECT * FROM test_pk_varchar ORDER BY id;
  id  |     name      |         created_at
------+---------------+----------------------------
 A002 | テストデータB | 2026-02-07 03:47:14.117366
 A003 | テストデータC | 2026-02-07 03:47:14.121746
 B001 | テストデータA | 2026-02-07 03:47:14.112257
(3 rows)

=>

DMS連携

DMSタスクの作成

  1. DMSタスクでは、スキーマコンバートと、テーブル名とカラム名を小文字(lowercase)にする設定をします

初期ロード

  1. DMSタスクを開始します

  2. 開始中になりました
    image.png

  3. しばらくすると、完了になりました
    image.png

  4. Auroraのテーブルの状態を確認します。絶妙に分かりづらいですが、created_atは変わっています(戻っています)

-- 数値型
=> SELECT * FROM test_pk_numeric ORDER BY id;
 id |     name      |     created_at
----+---------------+---------------------
  2 | テストデータ2 | 2026-02-07 03:09:22
  3 | テストデータ3 | 2026-02-07 03:09:22
 10 | テストデータ1 | 2026-02-07 03:09:22
(3 rows)



-- 文字列型

=> SELECT * FROM test_pk_varchar ORDER BY id;
  id  |     name      |     created_at
------+---------------+---------------------
 A002 | テストデータB | 2026-02-07 03:14:39
 A003 | テストデータC | 2026-02-07 03:14:39
 B001 | テストデータA | 2026-02-07 03:14:39
(3 rows)

=>

Oracleで数値型の主キーを更新したら、DMSでAuroraに連携できるか

Oracle側

1.事前に確認します

SQL> SELECT * FROM TEST_PK_NUMERIC ORDER BY ID;

        ID NAME                                                                                                 CREATED_
---------- ---------------------------------------------------------------------------------------------------- --------
         2 テストデータ2                                                                                        26-02-07
         3 テストデータ3                                                                                        26-02-07
        10 テストデータ1                                                                                        26-02-07

SQL>

2.更新します

SQL> UPDATE TEST_PK_NUMERIC SET ID = 20 WHERE ID = 2;
COMMIT;

1行が更新されました。

SQL>
コミットが完了しました。

SQL>

3.更新後の確認をします

SQL> SELECT * FROM TEST_PK_NUMERIC ORDER BY ID;

        ID NAME                                                                                                 CREATED_
---------- ---------------------------------------------------------------------------------------------------- --------
         3 テストデータ3                                                                                        26-02-07
        10 テストデータ1                                                                                        26-02-07
        20 テストデータ2                                                                                        26-02-07

SQL>
PostgreSQL
  1. 連携されたか確認します
  • Updates:1。ソースでキャプチャしたUPDATEの数
  • AppliedUpdates:1 ターゲットに実際に適用したUPDATEの数
aws dms describe-table-statistics \
  --replication-task-arn "arn:aws:dms:ap-northeast-1:XXXXXX:task:XXXXXX" \
  --region ap-northeast-1
  
{
    "TableStatistics": [
        {
            "SchemaName": "XXXXXXX",
            "TableName": "TEST_PK_NUMERIC",
            "Inserts": 0,
            "Deletes": 0,
            "Updates": 1,
            "Ddls": 0,
            "AppliedInserts": 0,
            "AppliedDeletes": 0,
            "AppliedUpdates": 1,
            "AppliedDdls": 0,
            "FullLoadRows": 3,
            "FullLoadCondtnlChkFailedRows": 0,
            "FullLoadErrorRows": 0,
            "FullLoadStartTime": "2026-02-07T13:12:36.936000+09:00",
            "FullLoadEndTime": "2026-02-07T13:12:38.201000+09:00",
            "FullLoadReloaded": false,
            "LastUpdateTime": "2026-02-07T13:23:12.226000+09:00",
            "TableState": "Table completed",
            "ValidationPendingRecords": 0,
            "ValidationFailedRecords": 0,
            "ValidationSuspendedRecords": 0,
            "ValidationState": "Not enabled",
            "ResyncState": "Not enabled",
            "ResyncRowsAttempted": 0,
            "ResyncRowsSucceeded": 0,
            "ResyncRowsFailed": 0,
            "ResyncProgress": 0.0
        }
    ]
}       

2.データを確認します。サポートしてないと思いきや、更新されています

=> SELECT * FROM test_pk_numeric ORDER BY id;
 id |     name      |     created_at
----+---------------+---------------------
  3 | テストデータ3 | 2026-02-07 03:09:22
 10 | テストデータ1 | 2026-02-07 03:09:22
 20 | テストデータ2 | 2026-02-07 03:09:22
(3 rows)

=>

Oracleで文字列の主キーを更新したら、DMSでAuroraに連携できるか

Oracle
  1. 事前に確認します
SQL> SELECT * FROM TEST_PK_VARCHAR ORDER BY ID;

ID                   NAME                                                                                                 CREATED_
-------------------- ---------------------------------------------------------------------------------------------------- --------
A002                 テストデータB                                                                                        26-02-07
A003                 テストデータC                                                                                        26-02-07
B001                 テストデータA                                                                                        26-02-07

SQL>

2.更新します

SQL> -- 文字型主キーの更新テスト
UPDATE TEST_PK_VARCHAR SET ID = 'A020' WHERE ID = 'A002';
COMMIT;
SQL>
1行が更新されました。

SQL>
コミットが完了しました。

SQL>

3.更新後の確認をします

SQL> SELECT * FROM TEST_PK_VARCHAR ORDER BY ID;

ID                   NAME                                                                                                 CREATED_
-------------------- ---------------------------------------------------------------------------------------------------- --------
A003                 テストデータC                                                                                        26-02-07
A020                 テストデータB                                                                                        26-02-07
B001                 テストデータA                                                                                        26-02-07

SQL>
PostgreSQL
  1. 連携されたか確認します
  • Updates:1。ソースでキャプチャしたUPDATEの数
  • AppliedUpdates:1 ターゲットに実際に適用したUPDATEの数
aws dms describe-table-statistics \
  --replication-task-arn "arn:aws:dms:ap-northeast-1:XXXXXX:task:XXXXXX" \
  --region ap-northeast-1

{
    "TableStatistics": [
        {
            "SchemaName": "XXXXXX",
            "TableName": "TEST_PK_VARCHAR",
            "Inserts": 0,
            "Deletes": 0,
            "Updates": 1,
            "Ddls": 0,
            "AppliedInserts": 0,
            "AppliedDeletes": 0,
            "AppliedUpdates": 1,
            "AppliedDdls": 0,
            "FullLoadRows": 3,
            "FullLoadCondtnlChkFailedRows": 0,
            "FullLoadErrorRows": 0,
            "FullLoadStartTime": "2026-02-07T13:12:38.090000+09:00",
            "FullLoadEndTime": "2026-02-07T13:12:38.530000+09:00",
            "FullLoadReloaded": false,
            "LastUpdateTime": "2026-02-07T13:30:12.218000+09:00",
            "TableState": "Table completed",
            "ValidationPendingRecords": 0,
            "ValidationFailedRecords": 0,
            "ValidationSuspendedRecords": 0,
            "ValidationState": "Not enabled",
            "ResyncState": "Not enabled",
            "ResyncRowsAttempted": 0,
            "ResyncRowsSucceeded": 0,
            "ResyncRowsFailed": 0,
            "ResyncProgress": 0.0
        }
    ]
}

2.データを確認します。更新されています

=> SELECT * FROM test_pk_varchar ORDER BY id;
  id  |     name      |     created_at
------+---------------+---------------------
 A003 | テストデータC | 2026-02-07 03:14:39
 A020 | テストデータB | 2026-02-07 03:14:39
 B001 | テストデータA | 2026-02-07 03:14:39
(3 rows)

=>

Oracleで数値型の主キーをバッチ更新したら、DMSでAuroraに連携できるか

Oracle

1.事前に確認します

SQL> SELECT * FROM TEST_PK_NUMERIC ORDER BY ID;

        ID NAME                                                                                                 CREATED_
---------- ---------------------------------------------------------------------------------------------------- --------
         3 テストデータ3                                                                                        26-02-07
        10 テストデータ1                                                                                        26-02-07
        20 テストデータ2                                                                                        26-02-07

SQL>

2.更新します

SQL> UPDATE TEST_PK_NUMERIC SET ID = ID + 100;
COMMIT;
3行が更新されました。

SQL>

コミットが完了しました。

SQL>

3.更新後の確認をします

SQL> SELECT * FROM TEST_PK_NUMERIC ORDER BY ID;

        ID NAME                                                                                                 CREATED_
---------- ---------------------------------------------------------------------------------------------------- --------
       103 テストデータ3                                                                                        26-02-07
       110 テストデータ1                                                                                        26-02-07
       120 テストデータ2                                                                                        26-02-07

SQL>
PostgreSQL
  1. 連携されたか確認します
aws dms describe-table-statistics --replication-task-arn "arn:aws:dms:ap-northeast-1:XXXXX:task:XXXXXXX" --query "TableStatistics[?TableName=='TEST_PK_NUMERIC']" --region ap-northeast-1

[
    {
        "SchemaName": "XXXXX",
        "TableName": "TEST_PK_NUMERIC",
        "Inserts": 0,
        "Deletes": 0,
        "Updates": 4,
        "Ddls": 0,
        "AppliedInserts": 0,
        "AppliedDeletes": 0,
        "AppliedUpdates": 4,
        "AppliedDdls": 0,
        "FullLoadRows": 3,
        "FullLoadCondtnlChkFailedRows": 0,
        "FullLoadErrorRows": 0,
        "FullLoadStartTime": "2026-02-07T13:12:36.936000+09:00",
        "FullLoadEndTime": "2026-02-07T13:12:38.201000+09:00",
        "FullLoadReloaded": false,
        "LastUpdateTime": "2026-02-07T13:52:12.222000+09:00",
        "TableState": "Table completed",
        "ValidationPendingRecords": 0,
        "ValidationFailedRecords": 0,
        "ValidationSuspendedRecords": 0,
        "ValidationState": "Not enabled",
        "ResyncState": "Not enabled",
        "ResyncRowsAttempted": 0,
        "ResyncRowsSucceeded": 0,
        "ResyncRowsFailed": 0,
        "ResyncProgress": 0.0
    }
]

2.データを確認します。更新されています。ドキュメントの記載とは異なる結果です

=> SELECT * FROM test_pk_numeric ORDER BY id;
 id  |     name      |     created_at
-----+---------------+---------------------
 103 | テストデータ3 | 2026-02-07 03:09:22
 110 | テストデータ1 | 2026-02-07 03:09:22
 120 | テストデータ2 | 2026-02-07 03:09:22
(3 rows)

=>

考察

DMS 3.5.4 で検証した結果、ドキュメントに記載されている「数値型主キーのバッチ更新はサポートされない」という制限は確認できず、単一行更新・バッチ更新ともに正常にCDC連携された。

ドキュメントの記述が古い、またはDMSのバージョンアップで制限が緩和された可能性あり。本番環境で主キー更新を行う場合は、事前に十分なテストが必要。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?