Maison >base de données >tutoriel mysql >Comment créer une séquence PostgreSQL dépendante d'une autre colonne ?

Comment créer une séquence PostgreSQL dépendante d'une autre colonne ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-24 05:58:13511parcourir

How to Create a PostgreSQL Sequence Dependent on Another Column?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn