普段は MySQL 使いの自分が IBM DB2 を使おうとして、意外とハマったのが以下に紹介する2点です。
まず1点目。MySQL ではテーブル列の属性に auto_increment という指定を付与することができます:
この属性が付いた列はデータ挿入時に値を指定する必要がなく、定義に従ったルールでユニークな値を勝手に挿入してくれる便利な属性です(赤字はコメントです):
これと同じことを DB2 利用時にもやりたい! のですが、DB2 では create table 時に auto_increment 属性を認識してくれません。
では DB2 で同じことをするには、create table 時にどのような指定をすればよいのでしょうか?
その答がこちらです。indentity 構文を使いますが、ちと面倒:
これをテーブル定義時に指定しておけば insert 時にはユニークな値を自動生成してくれるので楽ちんです。
2点目。同様に、MySQL では auto_increment 指定のある列に挿入された値を知りたい、と思うことがあります:
それは LAST_INSERT_ID() で取得できました。
これと同じことを DB2 の identity 指定した列に対してやるにはどうすればいいでしょうか?
その答は IDENTITY_VAL_LOCAL() です:
MySQL と DB2 で文法の違いがありますが、とりあえずはどちらも出来るということで。
自分が迷ったのは今のところこの位ですが、Bluemix を使うユーザーが増えると必然的(?)に SQL Database や dashDB を使う人も増えると思います。DB2 をベースにしたこれらのサービスを使う時に、今回紹介したような点で戸惑う人の助けになれば幸いです。
(参考にしたページ)
http://stackoverflow.com/questions/13466347/how-to-auto-increment-in-db2
http://stackoverflow.com/questions/3087836/db2-how-to-get-the-last-insert-id-from-a-table
まず1点目。MySQL ではテーブル列の属性に auto_increment という指定を付与することができます:
mysql> create table langs(
id int primary key auto_increment,
name varchar(256)
);
この属性が付いた列はデータ挿入時に値を指定する必要がなく、定義に従ったルールでユニークな値を勝手に挿入してくれる便利な属性です(赤字はコメントです):
mysql> insert into langs( name ) values( 'Java' ); nameだけを指定してinsert mysql> insert into langs( name ) values( 'PHP' ); mysql> insert into langs( name ) values( 'Ruby' ); mysql> select * from langs; +----+------+ | id | name | +----+------+ | 2 | Java | ユニークなid値が勝手に挿入されている | 12 | PHP | | 22 | Ruby | +----+------+
これと同じことを DB2 利用時にもやりたい! のですが、DB2 では create table 時に auto_increment 属性を認識してくれません。
では DB2 で同じことをするには、create table 時にどのような指定をすればよいのでしょうか?
その答がこちらです。indentity 構文を使いますが、ちと面倒:
db2> create table langs(
id int primary key generated always as identity (start with 1 increment by 1),
name varchar(256)
);
これをテーブル定義時に指定しておけば insert 時にはユニークな値を自動生成してくれるので楽ちんです。
2点目。同様に、MySQL では auto_increment 指定のある列に挿入された値を知りたい、と思うことがあります:
mysql> insert into langs( name ) values( 'Python' );
↑今、インサートしたこのレコードの ID 値が何だったのかを知りたい
それは LAST_INSERT_ID() で取得できました。
mysql> select last_insert_id() from langs;
これと同じことを DB2 の identity 指定した列に対してやるにはどうすればいいでしょうか?
その答は IDENTITY_VAL_LOCAL() です:
db2> select IDENTITY_VAL_LOCAL() from langs;
MySQL と DB2 で文法の違いがありますが、とりあえずはどちらも出来るということで。
自分が迷ったのは今のところこの位ですが、Bluemix を使うユーザーが増えると必然的(?)に SQL Database や dashDB を使う人も増えると思います。DB2 をベースにしたこれらのサービスを使う時に、今回紹介したような点で戸惑う人の助けになれば幸いです。
(参考にしたページ)
http://stackoverflow.com/questions/13466347/how-to-auto-increment-in-db2
http://stackoverflow.com/questions/3087836/db2-how-to-get-the-last-insert-id-from-a-table
コメント