Столбец Auto increment table

Используя 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

Любая идея, почему?

Ответ 1

Postgres 10 или новее

Рассмотрим столбец IDENTITY. Postgres 10 реализует эту стандартную SQL-функцию.

CREATE TABLE staff (
   staff_id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY
 , staff    text NOT NULL
);

Основной синтаксис и информация в руководство для CREATE TABLE.

Подробное объяснение в этой записи в блоге его основного автора Peter Eisentraut.

Poatgres 9.6 и старше

Используйте serial псевдо-тип данных:

CREATE TABLE staff (
   staff_id serial PRIMARY KEY,
 , staff    text NOT NULL
);

Создает и присоединяет объект последовательности автоматически и устанавливает DEFAULT в nextval() из последовательности. Он делает все, что вам нужно.

Я также использую только идентификаторы нижнего регистра в моем примере. Делает вашу жизнь с Postgres проще.

И лучше использовать описательные имена столбцов. "id" как имя - это анти-шаблон, используемый некоторым средним, но вряд ли описательным. Аналогично "name".

Ответ 2

В базе данных SQL Server вы можете использовать Identity(1,1) следующим образом:

CREATE TABLE Staff
(
    ID INT IDENTITY(1,1) NOT NULL,
    Name VARCHAR(40) NOT NULL,
    PRIMARY KEY (ID)
);

Ответ 3

Вы не укажете, какие RDBMS вы используете, однако в 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

Ответ 4

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)