1.やりたいこと
- IDENTITY列を持つテーブルに任意のデータを登録したい
- 自動採番されないでほしい
- LOADはしない [2018/2/11 追記]
(LOADしたい人はSVC34さんのコメントを参照するなど)
(メモ忘れてたのでメモです)
2. 前提とか
2.1. 環境
- IBM Db2 v11 Express-C
>db2level
DB21085I このインスタンスまたはインストール (該当する場合のインスタンス名:
"DB2") は "64" ビットおよび DB2 コード・リリース "SQL11011" をレベル ID
"0202010F" で使用します。
情報トークンは、"DB2
v11.1.1010.160"、"s1612051900"、"DYN1612051900WIN64"、およびフィックスパック "1"
です。
2.2. 準備
- テーブル
>type users.ddl
create table demo.users (
id bigint not null generated always as identity primary key,
name varchar(20) not null,
location varchar(20) not null
);
- データ
>type users.csv
1,"John","New York"
2,"Paul","London"
3,"George","Losangels"
3. 試してみる
3.1. INSERTしてみる
>db2 "insert into demo.users values (1, 'John', 'New York')"
DB21034E コマンドが、有効なコマンド行プロセッサー・コマンドでないため、 SQL
ステートメントとして処理されました。 SQL 処理中に、次のエラーが返されました。
SQL0798N GENERATED ALWAYS として定義されている列 "ID"
に値を指定することはできません。 SQLSTATE=428C9
だめです。
3.2. IMPORTしてみる
>db2 import from users.csv of del insert into demo.users
SQL3109N ユーティリティーが、ファイル "users.csv"
からデータのロードを開始しています。
SQL3550W 行 "1"、列 "1" のフィールド値は NULL
ではありませんが、ターゲット列は GENERATED ALWAYS として定義されています。
SQL3550W 行 "2"、列 "1" のフィールド値は NULL
ではありませんが、ターゲット列は GENERATED ALWAYS として定義されています。
SQL3550W 行 "3"、列 "1" のフィールド値は NULL
ではありませんが、ターゲット列は GENERATED ALWAYS として定義されています。
SQL3110N ユーティリティーが処理を完了しました。 "3"
行が、入力ファイルから読み取られました。
SQL3221W ...COMMIT WORK が開始されました。 入力レコード・カウント = "3"
SQL3222W ...すべてのデータベース変更の COMMIT が成功しました。
SQL3149N "3" 行が、入力ファイルから処理されました。 "0"
行が、正常に表に挿入されました。 "3" 行が、拒否されました。
読み込まれた行数 = 3
スキップされた行数 = 0
挿入された行数 = 0
更新された行数 = 0
拒否された行数 = 3
コミットされた行数 = 3
だめです。
4. やったこと
1. 列IDからIDENTITYを一時的に削除
>db2 alter table demo.users alter column id drop identity
DB20000I SQL コマンドが正常に完了しました。
2. データを登録
>db2 import from users.csv of del insert into demo.users
SQL3109N ユーティリティーが、ファイル "users.csv"
からデータのロードを開始しています。
SQL3110N ユーティリティーが処理を完了しました。 "3"
行が、入力ファイルから読み取られました。
SQL3221W ...COMMIT WORK が開始されました。 入力レコード・カウント = "3"
SQL3222W ...すべてのデータベース変更の COMMIT が成功しました。
SQL3149N "3" 行が、入力ファイルから処理されました。 "3"
行が、正常に表に挿入されました。 "0" 行が、拒否されました。
読み込まれた行数 = 3
スキップされた行数 = 0
挿入された行数 = 3
更新された行数 = 0
拒否された行数 = 0
コミットされた行数 = 3
>db2 "select * from demo.users"
ID NAME LOCATION
-------------------- -------------------- --------------------
1 John New York
2 Paul London
3 George Losangels
3 レコードが選択されました。
CSVの内容が登録されました。
3. 列IDにIDENTITYを再設定
>db2 alter table demo.users alter column id set generated always as identity
DB20000I SQL コマンドが正常に完了しました。
4. 列IDにIDENTITYの開始位置を設定
>db2 alter table demo.users alter column id restart with 4
DB20000I SQL コマンドが正常に完了しました。
>db2 "insert into demo.users (name, location) values ('Ringo', 'England')"
DB20000I SQL コマンドが正常に完了しました。
>db2 "select * from demo.users"
ID NAME LOCATION
-------------------- -------------------- --------------------
1 John New York
2 Paul London
3 George Losangels
4 Ringo England
4 レコードが選択されました。
新しいレコードも登録できました。
>db2 alter table demo.users alter column id set generated always as identity(start with 4)
DB20000I SQL コマンドが正常に完了しました。
列IDにIDENTITYを再設定する際に開始位置を設定することもできます。
5. 参考
おわり。