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é?
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:
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)