Tableau des incréments automatiques colonne

en utilisant Postgres, j'essaie d'utiliser AUTO_INCREMENT pour numéroter automatiquement ma clé primaire en SQL. Cependant, il me donne une erreur.

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

L'erreur:

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

une idée de pourquoi?

25
demandé sur Erwin Brandstetter 2012-03-26 19:42:40

4 réponses

Postgres 10 ou plus tard

considérons une colonne IDENTITY . Postgres 10 implémente cette fonctionnalité standard-SQL.

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

syntaxe de base et info dans le manuel pour CREATE TABLE .

Explication détaillée dans cette entrée de blog de son auteur principal Peter Eisentraut.


À ajouter une colonne IDENTITY à un tableau préexistant (rempli de lignes ou non):

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

Pour en faire le PK dans le même temps (le tableau ne peut pas avoir un PK encore):

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

il y avait un bug dans les premières versions, qui pouvait conduire à un message d'erreur comme:

ERROR: column "staff_id" contains null values

cela a été fixé avec Postgres 10.2. Détail:

Postgres 9.6 ou plus

utilisez la serial pseudo type de données à la place:

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

il crée et attache automatiquement l'objet sequence et fixe le DEFAULT à nextval() à partir du séquence. Il ne vous faut.

j'utilise aussi juste identificateurs de minuscules dans mon exemple. Ça rend la vie plus facile avec Postgres.

et mieux utiliser les noms de colonne descriptifs. "id" comme nom est un anti-motif, utilisé par certains moyens-ware, mais à peine descriptive. Similaire à"nom".

64
répondu Erwin Brandstetter 2018-05-22 01:18:05

vous ne spécifiez pas quels RDBMS vous utilisez, cependant, dans SQL Server vous pouvez utiliser cette syntaxe:

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
1
répondu Barry Kaye 2012-03-26 15:47:54

dans la base de données du serveur SQL vous pouvez utiliser Identity(1,1) comme ceci:

CREATE TABLE Staff
(
    ID INT IDENTITY(1,1) NOT NULL,
    Name VARCHAR(40) NOT NULL,
    PRIMARY KEY (ID)
);
1
répondu Royi Namir 2015-04-07 03:05:13

PostgreSQL: si vous devez absolument avoir votre propre valeur incrémentielle automatique:

puis utiliser une séquence:

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)
0
répondu Eric Leschinski 2015-04-07 03:13:48