SSブログ

Firebird 3.0 の新しい SQL 構文 [Firebird]

この記事はFirebird Advent Calendar 2017 https://qiita.com/advent-calendar/2017/firebird の15日目の記事です。

いままでと重複あるかもしれませんが、ここで Firebird3.0 のリリースノートを見直して、新しい SQL 構文を自分で試してみました。
https://firebirdsql.org/file/documentation/release_notes/Firebird-3.0.0-ReleaseNotes.pdf
(トリガーは自分は使わなさそうなので試してません)

【BOOLEAN Type】
いままでは 0/1 で持っていたのですが、BOOLEAN 型ができました。
SQL> CREATE TABLE bool_table (b BOOLEAN);
SQL> INSERT INTO bool_table (b) VALUES (TRUE);
SQL> INSERT INTO bool_table (b) VALUES (FALSE);
SQL> INSERT INTO bool_table (b) VALUES (NULL);


MySQL の boolean みたいに 1/0 じゃなくて true/false が返ります。

【自動インクリメント型のカラム定義】
今までも、 generator + trigger を使うとか、sequence を使うとかで、
自動インクリメントで採番するカラムの作成はできたんですが
https://firebirdsql.org/refdocs/langrefupd21-ddl-sequence.html

より、直接的に書ける方法ができました。
SQL> CREATE TABLE id_table (id INTEGER GENERATED BY DEFAULT AS IDENTITY, name VARCHAR(30));
SQL> INSERT INTO id_table (name) VALUES ('nakagami');
SQL> SELECT * FROM id_table;

          ID NAME
============ ==============================
           1 nakagami



採番される値をリセットするには、以下のような SQL文を使います
SQL> ALTER TABLE id_table ALTER COLUMN id RESTART; 
SQL> ALTER TABLE id_table ALTER COLUMN id RESTART WITH 100; 

WITH 100 を付けた場合、次の INSERT 文では 101 が設定されます。


【カラムの NOT NULL 制約を付ける、外す】
カラムの NOT NULL 制約を付けたり外したりするのに、今まではシステムテーブルを update するという荒業が行われていました。
http://www.firebirdfaq.org/faq103/

Firebird 3.0 から、このシステムテーブルの update ができなくなり(エラーになり)代わりに、カラムの nullability を設定する直接的な ALTER 文が書けるようになりました。

table に NOT NULL 制約を付ける
ALTER TABLE table_name ALTER COLUMN column_name SET NOT NULL;

table の NOT NULL 制約を外す
ALTER TABLE table_name ALTER COLUMN column_name DROP NOT NULL;

【OFFSET/FETCH 句】
結果セットの中の「何行目から何行」という指定をしたいときは、
いままでも、 FIRST ~ SKIP という構文は使えました。
https://scott.yang.id.au/2004/01/limit-in-select-statements-in-firebird.html

SQL:2008 標準で OFFSET ~ FETCH という構文があるそうで、Firebird 3.0 で、それが使えるようになりました
SQL> select id from id_table order by id;

          ID
============
           1
           2
           3
           4

SQL> select id from id_table order by id offset 1 rows fetch next 2 rows only;

          ID
============
           2
           3


コメント(0) 
共通テーマ:日記・雑感

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

Facebook コメント