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).
Réponses
Trop de publicités?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.
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 .
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;
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.