Firebird の SQL文(おぼえがき)

2008/12/6 更新

なんだか、いつも忘れちゃうので、最低限使うものの例を書いておくことにします。Firebird 全般に対するメモは Firebird関連のページに置いておきます。

もっとよいドキュメントは、Firebird SQL リファレンスにあります。

RDBを移行した時のメモも参考になるかもしれません。

ストアードプロシージャについては書いてませんので、 Introduction to InterBase Stored Procedures and Triggers 辺りをあたってください。

例示してある SQL文は、一応ストーリー立ててあるので、直前の SQL文も見ると判り易いかもしれません。

テーブル作成

CREATE TABLE foo (
    a INTEGER NOT NULL,
    b VARCHAR(30) NOT NULL UNIQUE,
    c VARCHAR(1024) NOT NULL,
    d DECIMAL(16,2),
    e DATE,
    f TIMESTAMP,
    g BLOB SUB_TYPE 0, -- 0:binary 1:text
    PRIMARY KEY (a),
    CONSTRAINT CHECK_A CHECK (a <> 0)
);

CREATE TABLE bar (
    i INTEGER NOT NULL,
    j VARCHAR(30) NOT NULL,
    k VARCHAR(1024),
    FOREIGN KEY (j) REFERENCES foo(b) ON UPDATE CASCADE
);

Generator の作成と初期値の設定

CREATE GENERATOR gen_foo;
SET GENERATOR gen_foo to 1000;

なお、Firebird 2.0 以降は SEQUENCE を使うほうがよいでしょう

トリガーの作成

主キーに Generatorでとってきた値を自動的に入れる。

set term !! ;
create trigger set_foo_primary for foo
  before insert
  as begin
    new.a = gen_id(gen_foo,1);
  end
!!
set term ; !! 

set term は、trigger の定義内で ";"を使っているため、別の文字を行末記号に使いたいだけ

トリガーの削除

isql コマンドで
SQL>show table foo;
を実行すると、foo に設定してあるトリガーがわかるので

DROP TRIGGER set_foo_primary;

Generator の削除

isql コマンドで
SQL>show generator;
を実行すると、定義してある Generator がわかるので

DROP GENERATOR gen_foo;

テーブルに制約を付加

ALTER TABLE bar ADD PRIMARY KEY(i, j);

フィールドの追加

ALTER TABLE bar ADD m TIME;

制約(主キー、外部キー、ユニークキー)の削除

isql コマンドで
SQL>show table foo;
を実行するとテーブル foo の制約名が(INTEG_24とか)わかるので

ALTER TABLE foo DROP CONSTRAINT INTEG_24;

外部キー制約に ON DELETE CASCADE を加えたくなった

isql コマンドで
SQL>show table bar;
を実行するとテーブル bar の外部キーの制約名が(INTEG_25とか)わかるのでALTER TABLE で、制約の削除→追加をする。

ALTER TABLE bar DROP CONSTRAINT INTEG_25;
ALTER TABLE bar ADD FOREIGN KEY (j) REFERENCES foo(b) ON UPDATE CASCADE ON DELETE CASCADE;

VARCHAR の最大文字列長を大きくする

ALTER TABLE foo ALTER COLUMN c TYPE VARCHAR(4096);

カラムの位置の変更

ALTER TABLE bar ALTER m POSITION 2;

カラム名称の変更

ALTER TABLE bar ALTER COLUMN m TO new_name;

インデックス追加

CREATE INDEX foo_d_index on foo(d);

インデックスの削除

isql コマンドで
SQL>show index foo;
を実行すると、foo に付加されているインデックスの名前がわかるので

DROP INDEX foo_d_index;

制約をつけた時にシステムが自動的につけるインデックスは RDB$xxxx となっている

データ追加

INSERT INTO foo (b, c) values ('something', 'stringdata');

INSERT INTO foo (b, c) select s, t FROM some_what_table WHERE u = 'some what';

データ更新

UPDATE foo SET b='B', c='C' WHERE  a=1000;

データ削除

DELETE FROM foo WHERE a=1000;

TRUNCATE TABLEは無いので、テーブルの中身を空にする場合も DELETE文を使う

テーブル削除

DROP TABLE bar;

最初の 10行を取得

SELECT FIRST 10 * FROM foo;

その他


Zope メモ