Столбец таблицы автоинкремента
Используя Postgres, я пытаюсь использовать AUTO_INCREMENT
нумерация моего первичного ключа автоматически в SQL. Тем не менее, это дает мне ошибку.
CREATE TABLE Staff (
ID INTEGER NOT NULL AUTO_INCREMENT,
Name VARCHAR(40) NOT NULL,
PRIMARY KEY (ID)
);
Ошибка:
********** Error ********** ERROR: syntax error at or near "AUTO_INCREMENT" SQL state: 42601 Character: 63
Есть идеи почему?
4 ответа
Postgres 10 или позже
serial
столбцы (см. ниже) остаются без изменений. Но рассмотрим IDENTITY
колонка. Postgres 10 реализует эту стандартную функцию SQL.
CREATE TABLE staff (
staff_id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY
, staff text NOT NULL
);
Основной синтаксис и информация в руководстве для CREATE TABLE
,
Подробное объяснение в этой записи блога его основного автора Питер Айзентраут.
Добавить IDENTITY
столбец к существующей таблице (заполнен строками или нет):
ALTER TABLE staff ADD COLUMN staff_id int GENERATED BY DEFAULT AS IDENTITY;
Чтобы сделать его одновременно PK (таблица еще не может иметь PK):
ALTER TABLE staff ADD COLUMN staff_id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY;
В ранних версиях была ошибка, которая могла привести к появлению сообщения об ошибке, такого как:
ERROR: column "staff_id" contains null values
Это было исправлено в Postgres 10.2. Подробности:
Postgres 9,6 или старше
Использовать serial
вместо этого псевдо-тип данных:
CREATE TABLE staff (
staff_id serial PRIMARY KEY,
, staff text NOT NULL
);
Он создает и присоединяет объект последовательности автоматически и устанавливает DEFAULT
в nextval()
из последовательности. Это все, что вам нужно.
Я также использую только строчные идентификаторы в моем примере. Облегчает вашу жизнь с Postgres.
И лучше использовать описательные имена столбцов. "id" в качестве имени - это анти-шаблон, используемый некоторыми промежуточными программами, но вряд ли описательный. Похоже на "имя".
Вы не указываете, какую СУБД вы используете, однако в SQL Server вы можете использовать этот синтаксис:
CREATE TABLE [dbo].[Staff]
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] VARCHAR(40) NOT NULL,
CONSTRAINT [ID] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
В базе данных сервера SQL вы можете использовать Identity(1,1)
как это:
CREATE TABLE Staff
(
ID INT IDENTITY(1,1) NOT NULL,
Name VARCHAR(40) NOT NULL,
PRIMARY KEY (ID)
);
PostgreSQL: если вам абсолютно необходимо иметь собственное значение автоинкремента:
Затем используйте последовательность:
ericlesc_schools=> drop table yar;
DROP TABLE
ericlesc_schools=> drop sequence user_id_seq;
DROP SEQUENCE
ericlesc_schools=> create sequence user_id_seq;
CREATE SEQUENCE
ericlesc_schools=> create table yar(
id int default nextval('user_id_seq'),
foobar varchar);
CREATE TABLE
ericlesc_schools=> insert into yar (foobar) values('hey alex');
INSERT 0 1
ericlesc_schools=> insert into yar (foobar) values('hey what derick');
INSERT 0 1
ericlesc_schools=> insert into yar (foobar) values('I look like a hushpuppy');
INSERT 0 1
ericlesc_schools=> select * from yar;
id | foobar
----+-----------------
1 | hey alex
2 | hey what derick
3 | I look like a hushpuppy
(3 rows)