Maison > base de données > tutoriel mysql > Comment appliquer des contraintes uniques avec des colonnes nullables dans une table de base de données ?

Comment appliquer des contraintes uniques avec des colonnes nullables dans une table de base de données ?

Barbara Streisand
Libérer: 2025-01-20 23:56:13
original
247 Les gens l'ont consulté

How to Enforce Unique Constraints with Nullable Columns in a Database Table?

Appliquer des contraintes uniques dans les tables contenant des colonnes nullables

Cet article aborde les défis liés à la création de contraintes uniques sur les tables contenant des colonnes nullables. L'objectif est d'empêcher plusieurs lignes d'avoir la même combinaison de valeurs, même si les colonnes nullables sont nulles.

Question :

Le schéma de table fourni a une colonne UserRepository nullable. Cependant, l'utilisateur souhaite s'assurer que pour chaque paire de UserId et RecipeId, une seule ligne existe, quelle que soit la valeur MenuId.

Réponse :

PostgreSQL 15 ou supérieur :

  • Utilisez la clause NULLS NOT DISTINCT dans la définition de contrainte UNIQUE.
ALTER TABLE Favorites
ADD CONSTRAINT Favorites_UniqueFavorite UNIQUE NULLS NOT DISTINCT (UserId, MenuId, RecipeId);
Copier après la connexion

PostgreSQL 14 ou version antérieure :

  • Créez deux index partiels :
CREATE UNIQUE INDEX favo_3col_uni_idx ON Favorites (UserId, MenuId, RecipeId)
WHERE MenuId IS NOT NULL;

CREATE UNIQUE INDEX favo_2col_uni_idx ON Favorites (UserId, RecipeId)
WHERE MenuId IS NULL;
Copier après la connexion

Avantages :

  • Appliquer efficacement les contraintes requises.

Inconvénients (index partiel uniquement) :

  • Limiter les références de clés étrangères et les options de clustering.
  • Dans certaines requêtes, cela ne fonctionnera pas s'il n'y a pas de condition WHERE correspondante.

Alternative :

  • Si plusieurs colonnes nullables sont impliquées, veuillez vous référer à la discussion dans cet article : "Pourquoi ma contrainte UNIQUE ne se déclenche-t-elle pas ?".

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