Colonna della tabella di incremento automatico

Usando Postgres, sto provando a usare AUTO_INCREMENT per numerare automaticamente la mia chiave primaria in SQL. Tuttavia, mi dà un errore.

 CREATE TABLE Staff ( ID INTEGER NOT NULL AUTO_INCREMENT, Name VARCHAR(40) NOT NULL, PRIMARY KEY (ID) ); 

L’errore:

 ********** Error ********** ERROR: syntax error at or near "AUTO_INCREMENT" SQL state: 42601 Character: 63 

Qualche idea del perché?

Postgres 10 o successivo

Considera una colonna IDENTITY . Postgres 10 implementa questa funzionalità SQL standard.

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

Sintassi di base e informazioni nel manuale per CREATE TABLE .
Spiegazione dettagliata in questo post del suo autore principale Peter Eisentraut.


Per aggiungere una colonna IDENTITY a una tabella preesistente (popolata con righe o meno):

 ALTER TABLE staff ADD COLUMN staff_id int GENERATED BY DEFAULT AS IDENTITY; 

Per renderlo anche PK allo stesso tempo (la tabella non può ancora avere un PK):

 ALTER TABLE staff ADD COLUMN staff_id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY; 

C’era un bug nelle prime versioni, che potrebbe portare a un messaggio di errore come:

 ERROR: column "staff_id" contains null values 

Questo problema è stato risolto con Postgres 10.2. Dettagli:

  • Come aggiungere una colonna Identity PostgreSQL 10 a una tabella esistente con le righe?

Postgres 9.6 o precedente

Utilizzare invece il tipo di pseudo dati serial :

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

Crea e allega automaticamente l’object sequenza e imposta DEFAULT su nextval() dalla sequenza. Fa tutto ciò di cui hai bisogno.

Nel mio esempio uso anche solo identificatori di lettere minuscole . Rendi più facile la tua vita con Postgres.

E meglio usare nomi di colonne descrittivi. “id” come nome è un anti-pattern, usato da alcuni middle-ware, ma difficilmente descrittivo. Simile a “nome”.

Non si specifica quale RDBMS si sta utilizzando, tuttavia, in SQL Server è ansible utilizzare questa syntax:

 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 

Nel database del server SQL è ansible utilizzare Identity(1,1) come questo:

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

PostgreSQL: se devi assolutamente avere il tuo valore di incremento automatico:

Quindi utilizzare una sequenza:

 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)