2013-12-26 9 views
31

Я пытаюсь добавить первичный ключ с автоинкрементами.Автоинкремент для первичного ключа PostgreSQL 9.1

Я прочитал несколько документов и другие вопросы - есть SERIAL и nextval() заявления, но это не сработает.

Вот что я сделал:

CREATE TABLE IF NOT EXISTS "category" (
    "id" integer SERIAL PRIMARY KEY, 
    "name" varchar(30) DEFAULT NULL 
); // the error near "SERIAL" 

и

CREATE SEQUENCE your_seq; 
CREATE TABLE IF NOT EXISTS "category" (
    "id" integer PRIMARY KEY nextval('your_seq'), 
    "name" varchar(30) DEFAULT NULL 
); // the error near 'nextval' 

Что я не так? Я просто хочу, чтобы увеличить первичный ключ на 1.

+4

Вы определяете «id» как INTEGER, а затем SERIAL. SERIAL - тип данных. PostgreSQL создаст для вас SEQUENCE. Вам просто нужно удалить INTEGER. –

+0

Таблица была заполнена данными перед добавлением ПК? –

ответ

82

serial есть, более или менее, колонного типа, так говоря integer serial, как говорят text text, просто сказать serial:

CREATE TABLE IF NOT EXISTS "category" (
    "id" SERIAL PRIMARY KEY, 
    "name" varchar(30) DEFAULT NULL 
); 

Если вы хотите создать секвенирования себя, то вы хотите, чтобы значение по умолчанию id следующего значения в последовательности и это означает, говоря default nextval('your_seq'):

CREATE SEQUENCE your_seq; 
CREATE TABLE IF NOT EXISTS "category" (
    "id" integer PRIMARY KEY default nextval('your_seq'), 
    "name" varchar(30) DEFAULT NULL 
); 

для имитации нас UAL serial поведения вы также хотите, чтобы последовательность, принадлежащую таблица:

alter sequence your_seq owned by category.id; 

Чтение Serial Types раздела руководства может быть плодотворными.


Я также рекомендовал бы, чтобы вы не дважды указывали свои имена таблиц и столбцов, если вам не нужно. PostgreSQL сбрасывает ваши идентификаторы на нижний регистр, поэтому id и "id" будут такими же, но ненужное цитирование - это плохая привычка, которая может легко привести к большому беспорядку котировок повсюду.

+0

Это правильный ответ с хорошим советом. –

+0

Как определить не null в серийном и основном поле? Id INT NOT NULL SERIAL PRIMARY KEY прав? – Shesha

+0

@Shesha: 'id serial not null primary key'. 'serial' - это, более или менее, тип столбца, который заботится о' int' и 'default nextval ...' для вас. –

Смежные вопросы