2016-08-29 25 views
0

私はPostgres 9.1を使用しています。 auto_increment(シリアル)が機能していません。あなたは構文を使用してテーブルを作成すると https://www.postgresql.org/docs/current/static/datatype-numeric.html#DATATYPE-SERIALPostgresのこの単純なテーブルでSERIALが動作しないのはなぜですか?

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シリアルプライマリキー、名前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'を使うと、シーケンスは自動的にバックグラウンドで作成されます。しかし、あなたがタイプで過度に複雑なセットアップを使用しているので、あなたはそれを自分で行う必要があります。 –

関連する問題