2012-11-20 34 views
27

これは簡単だと思っていましたが、私のdb2データベースでAUTO_INCREMENTを使うことはできません。私はいくつかの検索を行い、人々は "デフォルトで生成"を使用しているようですが、これは私のためには機能しません。db2のAUTO_INCREMENTの方法は?

ここでは、sidを自動インクリメントして作成したいテーブルを示します。

create table student(
     sid integer NOT NULL <auto increment?> 
     sname varchar(30), 
     PRIMARY KEY (sid) 
    ); 

どのポインタも高く評価されています。

答えて

44

create table student (
    sid integer not null GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1) 
    ,sname varchar(30) 
    ,PRIMARY KEY (sid) 
); 

シーケンスは、これを行うための別のオプションですが、あなたはあなたの特定の状況のた​​めdetermine which one is properする必要があります。詳細はcomparing sequences to identity columnsを参照してください。

+0

ありがとうIan。これは私が始めたところです。私は理由は分かりませんが、何らかの理由でこのクエリーの「生成された常に」部分が認識されません。私は右のparensを欠落しているエラーを得る...それはキーワードを再認識しない指標。 – Matt

+0

実行しているDB2のバージョンとプラットフォームは何ですか? –

+0

アイデンティティ・シーケンスの宣言の後にコンマ( ''、' ')がありませんが、それ以外の場合は_my_ DB2デプロイメントで機能します(ジャーナリングをオンにしていないので、現時点では)。 –

5

シーケンスオブジェクトで自動インクリメントフィールドを作成する必要があります(このオブジェクトは数値シーケンスを生成します)。

使用次のCREATE SEQUENCE構文は:

CREATE SEQUENCE seq_person 
    MINVALUE 1 
    START WITH 1 
    INCREMENT BY 1 
    CACHE 10 

上記のコードは、1から始まり、それはまた、パフォーマンスのために10個までの値をキャッシュします1ずつ増加しますseq_personと呼ばれるシーケンス・オブジェクトを作成します。キャッシュオプションは、より高速なアクセスのためにメモリに格納されるシーケンス値の数を指定します。 「人」テーブルに新しいレコードを挿入する

、我々は、NEXTVAL関数(この関数はseq_personシーケンスから次の値を取得します)を使用する必要があります:上記のSQL文の

INSERT INTO Persons (P_Id,FirstName,LastName) 
    VALUES (seq_person.nextval,'Lars','Monsen') 

を挿入します"Persons"テーブルへの新しいレコード。 「P_Id」列には、seq_personシーケンスから次の番号が割り当てられます。 "FirstName"列は "Lars"に設定され、 "LastName"列は "Monsen"に設定されます。あなたがIDENTITY列と呼ばれて探している

+0

DB2にはシーケンスがありますが、これはそのための1つの使用方法です(私が覚えていれば、自動生成列では同じ種類のオブジェクトを使用することがあります)、DB2はそのページにはリストされていません。 ..あなたはOracleのセットアップをコピーしましたか? OracleとDB2の間にはいくつかの大きな違いがあることに注意してください(バージョンによって異なる)ので、盲目的にコピーすることはできません。 (私は、私がDB2が欠けているだけでなく、postgreSQLとDerbyもすべてアクセスされているかもしれないが...) –

+0

@ Clockwork-Muse - この種の構文がdb2で動作する間は正しいですが、構文は異なります。 – Hogan

1

「将来の安全な」シーケンスを作成するためのいくつかのオプションのパラメータを追加しました。

CREATE SEQUENCE <NAME> 
    START WITH 1 
    INCREMENT BY 1 
    NO MAXVALUE 
    NO CYCLE 
    CACHE 10; 
1

ハイテーブルを作成するときに、まだAUTO_INCREMENTとして列を作成できない場合。最初の回避策としてあるテーブル作成:

テーブル学生( SID整数NULL NOT SNAMEのVARCHAR(30)、 PRIMARY KEY(SID) )を作成します。

、その後、明示的

それとも

ALTER TABLEの学生列を変更、次の

ALTER TABLEの学生が IDENTITYとしてデフォルトで生成された列のSIDセットを変える使っ府列を変更してみてくださいsid setデフォルトで生成 AS IDENTITY(100から始まる)

関連する問題