3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

IBM Db2 - IDENTITY列を持つテーブルにデータを登録する

Last updated at Posted at 2018-02-10

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. 参考

おわり。

3
2
2

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
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?