2016-08-29 45 views
0

我正在使用Postgres 9.1。和auto_increment(串行)不起作用。我剛剛發現了這個關於「串行」: https://www.postgresql.org/docs/current/static/datatype-numeric.html#DATATYPE-SERIAL爲什麼SERIAL在Postgres的這張簡單的桌子上不工作?

CREATE TYPE FAMILY AS(
    id int, 
    name VARCHAR(35), 
    img_address VARCHAR(150)); 

CREATE TABLE FAMILIES of FAMILY(
    id SERIAL primary key NOT NULL, 
    name NOT NULL 
    ); 

ERROR: syntax error at or near "SERIAL" 
LINE 7: id SERIAL primary key NOT NULL, 
         ^


********** Error ********** 

ERROR: syntax error at or near "SERIAL" 
SQL state: 42601 
+1

爲什麼你首先使用'TYPE'?你試圖解決的實際問題是什麼?爲什麼不使用'create table families(id serial primary key,name varchar(35),img_address varchar(150));'? –

+0

因爲我正在使用Java,我想在數據庫中創建對象。 – tomyforever

+1

這與您在數據庫中創建表的方式完全無關。除此之外,如果你只運行'create table family(...)',你自動也會有一個名爲'family'的類型。 –

回答

3

當您使用語法創建一個表:

CREATE TABLE xxx OF yyyy 

您可以添加默認值和約束,但不改變或指定列的類型。

SERIAL類型實際上是數據類型,NOT NULL約束和默認值規範的組合。它等效於:

integer NOT NULL DEFAULT nextval('tablename_colname_seq') 

參見:documentation for SERIAL

所以,相反,你將不得不使用:

CREATE SEQUENCE families_id_seq; 

CREATE TABLE FAMILIES of FAMILY(
    id WITH OPTIONS NOT NULL DEFAULT nextval('families_id_seq'), 
    name WITH OPTIONS NOT NULL 
); 

ALTER SEQUENCE families_id_seq OWNED BY FAMILIES.id; 

你將不得不手動創建序列families_id_seq爲好,如上圖所示。

+0

沒有明白。在文檔中,它說:「數據類型smallserial,serial和bigserial不是真正的類型,而僅僅是創建唯一標識符列的符號方便程度。」所以'串行'它只是我應該用於我的序列(我必須創建)的單詞? – tomyforever

+0

@ user3502170:如果您使用具有「正常」表格定義的「serial」,則序列將自動在後臺創建。但是,當你使用類型過於複雜的設置時,你需要自己做。 –

相關問題