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

# 1.やりたいこと

- IDENTITY列を持つテーブルに任意のデータを登録したい
- 自動採番されないでほしい
- LOADはしない [2018/2/11 追記]
<br>（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. 参考

- https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0000888.html


おわり。