2012-11-20 136 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

你尋找被稱爲IDENTITY列:

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

謝謝伊恩。這是我開始的地方。我不知道爲什麼,但無論出於何種原因,此查詢的「GENERATED ALWAYS」部分無法識別。我得到的錯誤遺漏了右側parens ...一個指標它不recog的關鍵字。 – Matt

+0

您正在運行哪個版本的DB2,以及在哪個平臺上運行? –

+0

在聲明身份序列後,您遺漏了逗號('',''),但它在_my_ DB2部署中可用(但我並未打開日記功能,因此我無法聲明主鍵在這一刻)。 –

5

您將不得不使用序列對象創建一個自動遞增字段(該對象生成一個數字序列)。

使用以下CREATE SEQUENCE語法:

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

以上代碼創建稱爲seq_person序列對象,即以1開始,將被遞增1。它也將緩存多達10個值的性能。緩存選項指定將多少個序列值存儲在內存中以便更快地訪問。

要插入一個新的記錄在「Persons」表中,我們將不得不使用NEXTVAL函數(此函數從seq_person序列中的下一個值):

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

上面的SQL語句會插入一個進入「人員」表的新記錄。 「P_Id」列將被分配seq_person序列中的下一個數字。 「FirstName」列將被設置爲「Lars」,並且「LastName」列將被設置爲「Monsen」。

+0

雖然我會授予DB2具有序列,並且這是他們的一個用法(如果我沒有記錯,自動生成的列可能使用相同類型的對象),但DB2並未在該頁面上列出。 ..你剛剛複製Oracle安裝程序?請記住,Oracle和DB2之間還有其他幾大差異(取決於版本),所以您不能盲目複製。 (我認爲我發現人們對w3schools的信心不足,相當合理:不僅他們缺少DB2,而且還有postgreSQL和Derby,這些都是常用的......也許不止是Access) –

+0

@ Clockwork-Muse - 你是正確的,而這種構造將在db2中工作,語法不同。 – Hogan

1

添加了一些可選參數來創建「未來安全」序列。

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

hi如果在創建表格時仍然無法將列創建爲AUTO_INCREMENT。作爲第一工作圍繞創建表是:

創建表的學生( SID整數NOT NULL SNAME VARCHAR(30), PRIMARY KEY(SID) );

,然後明確地試圖改變列BU使用以下

ALTER TABLE學生來改變生成的默認AS IDENTITY列SID集

或者

ALTER TABLE學生改變列sid set GENERATED BY DEFAULT AS身份驗證(以100開頭)