Столбец таблицы автоинкремента

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

Есть идеи почему?

 Tim Lehner26 мар. 2012 г., 17:52
 Joni26 мар. 2012 г., 17:46
Какую базу данных вы используете? «AUTO INCREMENT» существует только в нескольких. В Oracle, например, вам нужно создатьSEQUENCE.

Ответы на вопрос(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)

какую СУБД вы используете, однако в 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)
);
Решение Вопроса
Postgres 10 или позже

serial столбцы (см. ниже) остаются без изменений. Но рассмотримIDENTITY колонка. Postgres 10 реализует эту стандартную функцию SQL.

   staff_id <b>int GENERATED BY DEFAULT AS IDENTITY</b> 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. Подробности:

Как добавить столбец идентификации PostgreSQL 10 в существующую таблицу со строками?Postgres 9,6 или старше

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


   staff_id <b>serial</b> PRIMARY KEY,
 , staff    text NOT NULL
);

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

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

И лучше использовать описательные имена столбцов. «id» как имя - это анти-шаблон, используемый некоторыми промежуточными программами, но вряд ли описательный. Похоже на «имя».

 victor n.22 мая 2018 г., 02:50
Эрвин, ты спасатель жизни!
 Jimmy26 мар. 2012 г., 20:01
Большое спасибо за помощь!

Ваш ответ на вопрос