web-dev-qa-db-fra.com

AutoIncrement de la clé primaire PostgreSQL 9.1

J'essaie d'ajouter une clé primaire avec un auto-incrémentation.

J'ai lu des docs et d'autres questions - il y a des instructions SERIAL et nextval() mais cela ne fonctionne pas.

Voici ce que j'ai fait:

CREATE TABLE IF NOT EXISTS "category" (
  "id" integer SERIAL PRIMARY KEY,
  "name" varchar(30) DEFAULT NULL
); // the error near "SERIAL"

et

CREATE SEQUENCE your_seq;
CREATE TABLE IF NOT EXISTS "category" (
  "id" integer PRIMARY KEY nextval('your_seq'),
  "name" varchar(30) DEFAULT NULL
); // the error near 'nextval'

Qu'est-ce que je me trompe? Je veux juste incrémenter la clé primaire de 1.

32
WildDev

serial est plus ou moins un type de colonne. Dire integer serial revient donc à dire text text, il suffit de dire serial:

CREATE TABLE IF NOT EXISTS "category" (
  "id" SERIAL PRIMARY KEY,
  "name" varchar(30) DEFAULT NULL
);

Si vous voulez créer la séquence vous-même, vous voulez que la valeur par défaut de id soit la prochaine valeur de la séquence, ce qui signifie que vous devez dire default nextval('your_seq'):

CREATE SEQUENCE your_seq;
CREATE TABLE IF NOT EXISTS "category" (
  "id" integer PRIMARY KEY default nextval('your_seq'),
  "name" varchar(30) DEFAULT NULL
);

Pour simuler le comportement habituel serial, vous souhaiterez également que la séquence appartienne à la table:

alter sequence your_seq owned by category.id;

La lecture de la section Serial Types de ce manuel pourrait être fructueuse.


Je vous recommande également de ne pas mettre de double guillemet vos noms de table et de colonne à moins que vous n'ayez à le faire. PostgreSQL repliera vos identifiants en minuscules pour que id et "id" Soient identiques, mais les citations inutiles sont une mauvaise habitude qui peut facilement conduire à un grand désordre de citations partout.

86
mu is too short

Si quelqu'un doit modifier une table existante pour ajouter une clé primaire avec incrémentation automatique:

ALTER TABLE table_name ADD COLUMN pk_column_name SERIAL PRIMARY KEY;
2
Valentin