En utilisant Postgres, j'essaie d'utiliser AUTO_INCREMENT
pour numéroter ma clé primaire automatiquement en SQL. Cependant, cela 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 pourquoi?
Les colonnes serial
(voir ci-dessous) restent inchangées. Mais 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 informations dans le manuel pour CREATE TABLE
.
Explication détaillée dans cette entrée de blog de son auteur principal Peter Eisentraut.
Pour ajouter une colonne IDENTITY
dans une table préexistante (remplie avec des lignes ou non):
ALTER TABLE staff ADD COLUMN staff_id int GENERATED BY DEFAULT AS IDENTITY;
Pour en faire aussi le PK en même temps (la table ne peut pas encore avoir de PK):
ALTER TABLE staff ADD COLUMN staff_id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY;
Il y avait un bogue dans les premières versions, qui pouvait conduire à un message d'erreur comme:
ERROR: column "staff_id" contains null values
Cela a été corrigé avec Postgres 10.2. Détails:
Utilisez le pseudo type de données serial
à la place:
CREATE TABLE staff (
staff_id serial PRIMARY KEY,
, staff text NOT NULL
);
Il crée et attache automatiquement l'objet séquence et définit la variable DEFAULT
sur nextval()
à partir de la séquence. Il fait tout ce dont vous avez besoin.
J'utilise aussi juste identificateurs minuscules dans mon exemple. Facilite la vie avec Postgres.
Et mieux utiliser les noms de colonnes descriptifs. "id" comme nom est un anti-motif, utilisé par certains middle-ware, mais à peine descriptif. Similaire avec "nom".
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)
);
Vous ne spécifiez pas le SGBDR que 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
PostgreSQL: Si vous devez absolument avoir votre propre valeur d'incrémentation automatique:
Ensuite, utilisez 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)