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?
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".
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
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)
);
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)