Maison > base de données > tutoriel mysql > Comment appliquer des contraintes uniques dans PostgreSQL avec des colonnes NULL ?

Comment appliquer des contraintes uniques dans PostgreSQL avec des colonnes NULL ?

Patricia Arquette
Libérer: 2025-01-21 00:02:10
original
569 Les gens l'ont consulté

How to Enforce Unique Constraints in PostgreSQL with NULL Columns?

Contraintes uniques PostgreSQL et colonnes NULL : un guide pratique

La gestion des contraintes uniques dans PostgreSQL lorsqu'il s'agit de colonnes nullables nécessite une attention particulière. Imaginez un tableau avec des colonnes UserId, MenuId et RecipeId, où UserId et RecipeId ne sont pas nuls. Une contrainte unique standard sur ces colonnes permettrait des entrées en double si MenuId diffère, y compris les valeurs NULL.

Voici des stratégies efficaces pour résoudre ce problème :

PostgreSQL 15 et versions ultérieures

PostgreSQL 15 a introduit la clause NULLS NOT DISTINCT, offrant une solution simple. Cette clause traite les valeurs NULL comme égales lors de l'application de l'unicité au sein des contraintes et des index :

<code class="language-sql">ALTER TABLE favorites
ADD CONSTRAINT favo_uni UNIQUE NULLS NOT DISTINCT (user_id, menu_id, recipe_id);</code>
Copier après la connexion

PostgreSQL 14 et versions antérieures

Pour les anciennes versions de PostgreSQL, l'approche recommandée consiste à créer des index partiels :

<code class="language-sql">CREATE UNIQUE INDEX favo_3col_uni_idx ON favorites (user_id, menu_id, recipe_id)
WHERE menu_id IS NOT NULL;

CREATE UNIQUE INDEX favo_2col_uni_idx ON favorites (user_id, recipe_id)
WHERE menu_id IS NULL;</code>
Copier après la connexion

Cela renforce efficacement l'unicité en créant des index séparés pour les lignes où menu_id est NULL et où il n'est PAS NULL.

Considérations importantes pour les index partiels

L'utilisation d'index partiels introduit certaines limitations :

  • Les contraintes de clé étrangère ne peuvent pas être directement appliquées à la combinaison à trois colonnes (user_id, menu_id, recipe_id).
  • Le clustering basé sur des index partiels n'est pas pris en charge.
  • Les requêtes dépourvues de clauses WHERE correspondantes n'utiliseront pas les index partiels.

Bonnes pratiques :

Il est conseillé d'utiliser des identifiants minuscules (par exemple, favorites) dans PostgreSQL pour des raisons de cohérence et pour éviter des problèmes potentiels. Le choix de la méthode appropriée dépend de votre version de PostgreSQL et de vos besoins spécifiques. La clause NULLS NOT DISTINCT offre une solution plus propre dans les versions plus récentes, tandis que les index partiels offrent une alternative fonctionnelle pour les anciennes versions.

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!

source:php.cn
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