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
Libérer: 2025-01-24 05:58:13
original
531 Les gens l'ont consulté

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 :

CREATE TABLE stuff (
    id integer PRIMARY KEY,
    seq integer NOT NULL,
    data text
);
Copier après la connexion

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>
Copier après la connexion

Créer des tables auxiliaires et des déclencheurs

Pour ce faire, vous devez créer deux tables et un déclencheur :

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;
Copier après la connexion
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 :

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();
Copier après la connexion

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 :

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;
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal