688 votes

Auto-incrémentation PostgreSQL

Je suis en train de passer de MySQL à PostgreSQL et je me demandais comment je pouvais faire des valeurs auto-incrémentées. J'ai vu dans la documentation de PostgreSQL un type de données "serial", mais j'obtiens des erreurs de syntaxe lorsque je l'utilise (dans la version 8.0).

800voto

Trey Points 4170

Oui, SERIAL est la fonction équivalente.

CREATE TABLE foo (
id SERIAL,
bar varchar);

INSERT INTO "foo" (bar) values ('blah');
INSERT INTO "foo" (bar) values ('blah');

SELECT * FROM foo;

1,blah
2,blah

SERIAL est juste une macro de création de temps de table autour des séquences. Vous ne pouvez pas modifier SERIAL sur une colonne existante.

252voto

Ahmad Points 1308

Vous pouvez utiliser n'importe quel autre type de données integer tels que smallint .

Exemple :

CREATE SEQUENCE user_id_seq;
CREATE TABLE user (
    user_id smallint NOT NULL DEFAULT nextval('user_id_seq')
);
ALTER SEQUENCE user_id_seq OWNED BY user.user_id;

Il est préférable d'utiliser son propre type de données, plutôt que de faire appel à l'utilisateur. type de données en série .

122voto

sereja1c Points 336

Si vous voulez ajouter une séquence à l'id dans la table qui existe déjà, vous pouvez utiliser :

CREATE SEQUENCE user_id_seq;
ALTER TABLE user ALTER user_id SET DEFAULT NEXTVAL('user_id_seq');

17voto

trev Points 41

Vous devez faire attention à ne pas insérer directement dans votre champ SERIAL ou séquence, sinon votre écriture échouera lorsque la séquence atteindra la valeur insérée :

-- Table: "test"

-- DROP TABLE test;

CREATE TABLE test
(
  "ID" SERIAL,
  "Rank" integer NOT NULL,
  "GermanHeadword" "text" [] NOT NULL,
  "PartOfSpeech" "text" NOT NULL,
  "ExampleSentence" "text" NOT NULL,
  "EnglishGloss" "text"[] NOT NULL,
  CONSTRAINT "PKey" PRIMARY KEY ("ID", "Rank")
)
WITH (
  OIDS=FALSE
);
-- ALTER TABLE test OWNER TO postgres;
 INSERT INTO test("Rank", "GermanHeadword", "PartOfSpeech", "ExampleSentence", "EnglishGloss")
           VALUES (1, '{"der", "die", "das", "den", "dem", "des"}', 'art', 'Der Mann küsst die Frau und das Kind schaut zu', '{"the", "of the" }');

 INSERT INTO test("ID", "Rank", "GermanHeadword", "PartOfSpeech", "ExampleSentence", "EnglishGloss")
           VALUES (2, 1, '{"der", "die", "das"}', 'pron', 'Das ist mein Fahrrad', '{"that", "those"}');

 INSERT INTO test("Rank", "GermanHeadword", "PartOfSpeech", "ExampleSentence", "EnglishGloss")
           VALUES (1, '{"der", "die", "das"}', 'pron', 'Die Frau, die nebenen wohnt, heißt Renate', '{"that", "who"}');

SELECT * from test;

16voto

Prince Points 796

Dans le contexte de la question posée et en réponse au commentaire ci-dessus, la création de SERIAL crée implicitement des séquences, donc pour l'exemple ci-dessus-

CREATE TABLE foo (id SERIAL,bar varchar);

CREATE TABLE créerait implicitement la séquence foo_id_seq pour la colonne de série foo.id . Par conséquent, SERIAL L'option [4 octets] est bonne pour sa facilité d'utilisation, sauf si vous avez besoin d'un type de données spécifique pour votre identifiant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X