475 votes

PostgreSQL Autoincrement

Je suis passer de MySQL à PostgreSQL et je me demandais comment je peux faire d'auto-incrémentation des valeurs. J'ai vu dans le PostgreSQL docs un type de données "de série", mais j'obtiens des erreurs de syntaxe lors de l'utilisation (en v8.0).

608voto

Trey Points 4170

Oui, la SÉRIE est l'équivalent de la fonction.

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

La SÉRIE est juste de créer un tableau de temps de macro autour de séquences. Vous ne pouvez pas modifier SÉRIE sur une colonne existante.

204voto

Ahmad Points 1308

Vous pouvez utiliser tout autre type de données entier, comme 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;

Mieux utiliser votre propre type de données, plutôt que d'user de série type de données.

85voto

sereja1c Points 336

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

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

16voto

trev Points 41

Vous devez faire attention de ne pas insérer directement dans votre SÉRIE ou de la séquence de champ, sinon votre écriture échoue lors de la séquence atteint 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; 

14voto

Prince Points 796

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

CREATE TABLE foo (id SERIAL,bar varchar);

CREATE TABLE serait implicitement création de la séquence d' foo_id_seq pour la série de la colonne foo.id. Par conséquent, SERIAL [4 Octets] est bon pour sa facilité d'utilisation, sauf si vous avez besoin d'un type de données de votre pièce d'identité.

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: