Подтвердить что ты не робот

Автоинкремент первичного ключа 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.

4b9b3361

Ответ 1

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
);

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

alter sequence your_seq owned by category.id;

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


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

Ответ 2

Если кому-то нужно изменить существующую таблицу, чтобы добавить первичный ключ с автоинкрементом:

ALTER TABLE table_name ADD COLUMN pk_column_name SERIAL PRIMARY KEY;