2016-08-29 8 views
0

저는 Postgres 9.1을 사용하고 있습니다. auto_increment (serial)가 작동하지 않습니다. 난 그냥 '시리얼'에 대한이를 발견했습니다 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 시리얼 프라이 머리 키, 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') 

참조 :

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을 만들어야 할 것입니다, 위의 그림과 같이 documentation for SERIAL

그래서, 대신 사용 할 것 .

+0

이해 못 했어. 문서에서 그것은 : "smallserial, serial 및 bigserial 데이터 유형은 실제 유형이 아니며 고유 식별자 열을 작성하기위한 표기법의 편의성"입니다. 그래서 '연쇄 (serial)'는 내가 만들어야 할 순서 (sequence)에 사용해야하는 단어입니까? – tomyforever

+0

@ user3502170 : "serial"을 "normal"테이블 정의와 함께 사용하면 시퀀스가 ​​백그라운드에서 자동으로 생성됩니다. 하지만 유형이 지나치게 복잡한 설정을 사용하는 경우 직접해야합니다. –