web-dev-qa-db-fra.com

Quel est le but de nommer la contrainte

Quel est le but de nommer vos contraintes (unique, clé primaire, clé étrangère)?

Disons que j'ai une table qui utilise des clés naturelles comme clé primaire:

CREATE TABLE Order
(
    LoginName        VARCHAR(50)    NOT NULL,
    ProductName      VARCHAR(50)    NOT NULL,
    NumberOrdered    INT            NOT NULL,
    OrderDateTime    DATETIME       NOT NULL,
    PRIMARY KEY(LoginName, OrderDateTime)
);

Quels sont les avantages (le cas échéant) de la dénomination de ma PK?

Par exemple. Remplacer:

    PRIMARY KEY(LoginName, OrderDateTime)

Avec:

    CONSTRAINT Order_PK PRIMARY KEY(LoginName, OrderDateTime)

Désolé si mon modèle de données n'est pas le meilleur, je suis novice dans ce domaine!

35
Andrew

Voici quelques raisons assez simples.

(1) Si une requête (insertion, mise à jour, suppression) viole une contrainte, SQL génère un message d'erreur contenant le nom de la contrainte. Si le nom de la contrainte est clair et descriptif, le message d'erreur sera plus facile à comprendre. si le nom de la contrainte est un nom aléatoire basé sur des indications, il est beaucoup moins clair. Particulier pour les utilisateurs finaux, qui vont (ok, peut-être) vous téléphoner pour demander ce que signifie "FK__B__B_COL1__75435199".

(2) Si une contrainte doit être modifiée à l'avenir (oui, ça arrive), c'est très difficile à faire si vous ne savez pas comment elle s'appelle. (ALTER TABLE MyTable drop CONSTRAINT um ...) Et si vous créez plusieurs instances de la base de données "à partir de zéro" et utilisez des noms par défaut générés par le système, il n'y aura jamais deux noms identiques.

(3) Si la personne qui supporte votre code (c'est-à-dire un administrateur de base de données) doit perdre beaucoup de temps inutile pour traiter le cas (1) ou le cas (2) à 3 heures du matin dimanche, ils sont probablement en mesure de Identifiez l'origine du code et soyez capable de réagir en conséquence.

78
Philip Kelley

Pour identifier la contrainte dans le futur (par exemple, vous voulez la supprimer dans le futur), vous devez lui attribuer un nom unique. Si vous ne spécifiez pas de nom, le moteur de base de données vous attribuera probablement un nom étrange (contenant par exemple des éléments aléatoires pour garantir l'unicité).

7
Mehrdad Afshari

Les administrateurs de base de données sont satisfaits, ils permettent donc à votre définition de schéma de figurer dans la base de données de production.

3
mtnygard

Lorsque votre code viole de manière aléatoire une contrainte de clé étrangère, il vous permet de gagner du temps sur le débogage pour déterminer laquelle. Leur dénomination simplifie grandement le débogage de vos insertions et de vos mises à jour.

3
Tim Howland

Cela aide quelqu'un à savoir rapidement ce que font les contraintes sans avoir à regarder la contrainte réelle, car le nom vous donne toutes les informations dont vous avez besoin.

Je sais donc s’il s’agit d’une clé primaire, d’une clé unique ou d’une clé par défaut, ainsi que de la table et éventuellement des colonnes impliquées.

2
James Black

En nommant correctement toutes les contraintes, vous pouvez rapidement associer une contrainte particulière à notre modèle de données. Cela nous donne deux avantages réels:

  1. Nous pouvons rapidement identifier et corriger les erreurs.
  2. Nous pouvons modifier ou supprimer les contraintes de manière fiable.
1
GG.

En nommant les contraintes, vous pouvez en différencier les violations. Ce n'est pas seulement utile pour les administrateurs et les développeurs, mais votre programme peut également utiliser les noms de contraintes. C'est beaucoup plus robuste que d'essayer d'analyser le message d'erreur. En utilisant des noms de contrainte, votre programme peut réagir différemment en fonction de la contrainte violée.

Les noms de contrainte sont également très utiles pour afficher les messages d'erreur appropriés dans la langue de l'utilisateur, indiquant le champ qui a provoqué une violation de contrainte au lieu de simplement transférer un message d'erreur cryptique du serveur de base de données à l'utilisateur.

Voir ma réponse sur comment faire cela avec PostgreSQL et Java .

0
Martin