---------------- Identity Columns ---------------- Author: Adriano dos Santos Fernandes Description: An identity column is a column associated with an internal sequence generator and has it value automatically set when omitted in an INSERT statement. Syntax: ::= GENERATED BY DEFAULT AS IDENTITY [ (START WITH ) ] ::= RESTART [ WITH ] Syntax rules: - The type of an identity column must be an exact number type with zero scale. That includes: smallint, integer, bigint, numeric(x, 0) and decimal(x, 0). - Identity columns can't have DEFAULT or COMPUTED value. Notes: - You cannot alter a identity column to normal column and vice versa. - Identity columns are implicitly NOT NULL. - Identity columns don't enforce uniqueness automatically. Use UNIQUE or PRIMARY key for that. Implementation: Two columns have been inserted in RDB$RELATION_FIELDS: RDB$GENERATOR_NAME and RDB$IDENTITY_TYPE. RDB$GENERATOR_NAME stores the automatically created generator for the column. In RDB$GENERATORS, the value of RDB$SYSTEM_FLAG of that generator will be 6. RDB$IDENTITY_TYPE will currently always store the value 1 (by default) for identity columns and NULL for non-identity columns. In the future this column will store the value 0, too (for ALWAYS) when Firebird support this type of identity column. Example: create table objects ( id integer generated by default as identity primary key, name varchar(15) ); insert into objects (name) values ('Table'); insert into objects (name) values ('Book'); insert into objects (id, name) values (10, 'Computer'); select * from objects order by id; commit; ID NAME ============ =============== 1 Table 2 Book 10 Computer alter table objects alter id restart with 14; insert into objects (name) values ('Pencil'); select * from objects order by id; ID NAME ============ =============== 1 Table 2 Book 10 Computer 15 Pencil