Maison >base de données >tutoriel mysql >Comment créer une séquence PostgreSQL dépendante d'une autre colonne ?
PostgreSQL : Créer une séquence auxiliaire basée sur une autre colonne
Dans PostgreSQL, vous pouvez créer une séquence qui dépend d'une autre colonne, vous permettant de générer des numéros de séquence au sein d'un sous-groupe d'une table.
Considérez la forme suivante :
<code class="language-sql">CREATE TABLE stuff ( id integer PRIMARY KEY, seq integer NOT NULL, data text );</code>
Vous souhaitez que chaque combinaison d'identifiant et de séquence soit unique, comme dans l'exemple suivant :
<code>ID | SEQ | DATA ----+------ +------------------- 1 | 1 | Quick brown fox... 1 | 2 | Quick brown fox... 1 | 3 | Quick brown fox... 2 | 1 | Quick brown fox... 3 | 1 | Quick brown fox...</code>
Créer des tables auxiliaires et des déclencheurs
Pour ce faire, vous devez créer deux tables et un déclencheur :
<code class="language-sql">CREATE TABLE things ( id SERIAL PRIMARY KEY, name text ); CREATE TRIGGER make_thing_seq AFTER INSERT ON things FOR EACH ROW EXECUTE PROCEDURE nextval('things_id_seq'); CREATE SEQUENCE things_id_seq;</code>La table
things
est la table parent contenant les colonnes id
. Le déclencheur make_thing_seq
crée automatiquement une nouvelle séquence nommée things
pour chaque ligne insérée dans la table thing_seq_<thing_id>
.
Remplir la séquence Stuff
Vous devez maintenant créer un deuxième déclencheur pour remplir la colonne stuff
du tableau seq
:
<code class="language-sql">CREATE FUNCTION fill_in_stuff_seq() RETURNS trigger AS $$ BEGIN NEW.seq := nextval('thing_seq_' || NEW.id); RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER fill_in_stuff_seq BEFORE INSERT ON stuff FOR EACH ROW EXECUTE PROCEDURE fill_in_stuff_seq();</code>
Ce déclencheur garantit que lorsqu'une nouvelle ligne est insérée dans la table stuff
, il récupère la séquence correspondante (en fonction de la colonne id
) et attribue sa valeur suivante à la colonne seq
. Notez que l'instruction LANGUAGE plpgsql
est ajoutée ici pour spécifier clairement que le langage de la fonction est PL/pgSQL.
Démo
Insérez quelques données et vérifiez la génération de séquence :
<code class="language-sql">INSERT INTO things (name) VALUES ('Joe'); INSERT INTO things (name) VALUES ('Bob'); SELECT * FROM things; -- 检查序列表 \d+ things_id_seq INSERT INTO stuff (id, data) VALUES (1, 'Keychain'); INSERT INTO stuff (id, data) VALUES (1, 'Pet goat'); INSERT INTO stuff (id, data) VALUES (2, 'Family photo'); INSERT INTO stuff (id, data) VALUES (1, 'Redundant lawnmower'); SELECT * FROM stuff;</code>
Le résultat démontrera l'attribution automatique des séquences en fonction de la colonne id
. La commande d things_id_seq
est utilisée pour afficher les détails de la séquence.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!