概要: このチュートリアルでは、GENERATED AS IDENTITY
を使用して、テーブルの SQL Identity 列を作成する方法を学びます。
SQL Identity 列の紹介
SQL Identity 列は、テーブルに新しい行を追加すると値が自動的に生成される列です。Identity 列を定義するには、次のように GENERATED AS IDENTITY
プロパティを使用します。
column_name data_type GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY[ ( sequence_option ) ]
Code language: SQL (Structured Query Language) (sql)
この構文では
data_type
は、任意の整数データ型にすることができます。GENERATED ALWAYS
は、Identity 列にシーケンシャルな整数を生成します。挿入(または更新)しようとするとGENERATED ALWAYS AS IDENTITY
列に値を挿入すると、データベースシステムはエラーを発生させます。GENERATED BY DEFAULT
は、Identity 列にシーケンシャルな整数を生成します。ただし、挿入または更新の値を指定すると、データベースシステムは自動生成値の代わりにその値を挿入に使用します。
SQL Identity 列の例
A) GENERATED ALWAYS の例
まず、テーブルを作成します。そのテーブルの名前をranks
とし、rank_id
列をIdentity列とします。
CREATE TABLE ranks (
rank_id INT GENERATED ALWAYS AS IDENTITY,
rank_name CHAR
);
Code language: SQL (Structured Query Language) (sql)
次に、新しい行をranks
テーブルに挿入します。
INSERT INTO ranks (rank_name)
VALUES
('A');
Code language: SQL (Structured Query Language) (sql)
rank_id
列にGENERATED AS IDENTITY
プロパティがあるため、データベースシステムは以下のようにシーケンシャルな整数を生成します。
SELECT
*
FROM
ranks;
Code language: SQL (Structured Query Language) (sql)

次に、rank_id
列とrank_name
列の両方に値を指定して新しい行を挿入します。
INSERT INTO ranks (rank_id, rank_name)
VALUES
(2, 'B');
Code language: SQL (Structured Query Language) (sql)
データベースシステムは次のエラーを発行しました。
[Err] ERROR: cannot insert into column "rank_id"
DETAIL: Column "rank_id" is an identity column defined as GENERATED ALWAYS.
Code language: SQL (Structured Query Language) (sql)
このエラーを修正するには、GENERATED BY DEFAULT AS IDENTITY
を使用します。
B) GENERATED BY DEFAULT AS IDENTITY の例
まず、削除してranks
テーブルを再作成します。今回はGENERATED BY DEFAULT AS IDENTITY
プロパティを使用します。
DROP TABLE ranks;
CREATE TABLE ranks (
rank_id INT GENERATED BY DEFAULT AS IDENTITY,
rank_name CHAR NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
次に、ranks
テーブルに行を挿入します。
INSERT INTO ranks (rank_name)
VALUES
('A');
Code language: SQL (Structured Query Language) (sql)
期待通りに動作します。
次に、rank_id
列の値を持つ別の行を挿入します。
INSERT INTO ranks (rank_id, rank_name)
VALUES
(2, 'B');
Code language: SQL (Structured Query Language) (sql)

GENERATED ALWAYS AS IDENTITY
を使用する前の例とは異なり、このステートメントも機能することに注意してください。
C) シーケンスオプションの例
次の構文を使用して、Identity 列の開始値と増分値を指定できます。
START WITH starting_value
INCREMENT BY increment_value;
Code language: SQL (Structured Query Language) (sql)
次の例を参照してください。
DROP TABLE ranks;
CREATE TABLE ranks (
rank_id INT GENERATED BY DEFAULT AS IDENTITY
(START WITH 10 INCREMENT BY 10),
rank_name CHAR NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
この例では、rank_id
列の自動生成値は10から始まり、増分値も10です。
まず、ranks
テーブルに新しい行を挿入します。
INSERT INTO ranks (rank_name)
VALUES
('A');
Code language: SQL (Structured Query Language) (sql)
rank_id
列の開始値は以下のように10です。
SELECT
*
FROM
ranks;
Code language: SQL (Structured Query Language) (sql)

次に、ranks
テーブルに別の行を挿入します。
INSERT INTO ranks (rank_name)
VALUES
('B');
Code language: SQL (Structured Query Language) (sql)
増分値オプションのため、2行目のrank_id
の値は20になります。
SELECT
*
FROM
ranks;
Code language: SQL (Structured Query Language) (sql)

このチュートリアルでは、GENERATED AS IDENTITY
を使用してSQL Identity列を定義する方法を学びました。