Oracle : ADD CONSTRAINT impossible - SQL/NoSQL - Programmation
Marsh Posté le 18-01-2008 à 00:35:04
Les contraintes sont des sources d'ennui.
Il vaut mieux coder la bonne cohérence des données lors des insertions en base par de la programmation traditionnelle.
Les clés primaires ont déjà la contrainte d'unicité, ce qui est suffisant habituellement.
Dans ma documentation, je lis que la syntaxe est :
CONSTRAINT constraint_name UNIQUE(column_name)); |
Marsh Posté le 18-01-2008 à 11:32:46
Tu peux éventuellement créer un index unique aussi :
create unique index uix_designation on <tatable>(designation)
Marsh Posté le 18-01-2008 à 12:53:59
olivthill a écrit : Les contraintes sont des sources d'ennui.
|
L'interet des contraintes ce n'est pas de remplacer le code final, c'est de garantir une cohérence maximale de la base. Et si ton logiciel a un bug ou une faille, tu seras content d'avoir mis en place les bonnes contraintes aux bons endroits.
Ensuite il y a des regles à respecter pour poser des contraintes, afin d'évier que ca devienne un casse tete. Mais dans le cas d'une containte d'unicité, je vois pas le probleme.
durst> Tu ne serais pas en train de déclarer une clef primaire de ta table plutot ?
MagicBuzz a écrit : Tu peux éventuellement créer un index unique aussi : |
C'est très sale comme idée, je ne cautionne pas
En plus, si il s'agit d'une clef primaire, l'index est automatiquement créé par Oracle au bon moment et de manière transparente.
Marsh Posté le 18-01-2008 à 13:59:58
un index unique, c'est pas une clé primaire hein.
c'est ce qu'on appelle une clé alternative. certains SGBD comme Ingres disposaient d'ailleurs d'un synonyme pour unique index, nommé "alternate key" (et c'est 100% prévu dans la méthode MERISE)
et la notion de contrainte d'unicité et d'index unique sont équivalents, à la différence près que l'index unique permet en plus de la contrainte, d'effectuer des recherches rapides sur les valeurs
jusqu'à Oracle 8i, contrainte unique et clé unique étaient d'ailleurs synonymes, d'un point de vue mécanismes, c'était purement la même chose qui était effectuée (car pour vérifier l'unicité, c'est plus rapide si on se base sur un index de toute façon)
ps : et une clé primaire sur une désignation, ça me ferais mal quand même
Marsh Posté le 18-01-2008 à 14:29:24
MagicBuzz a écrit : un index unique, c'est pas une clé primaire hein. |
Donc en gros, tu proposes d'utiliser explicitement un index là ou on veut une simple contrainte d'unicité ?
MagicBuzz a écrit : jusqu'à Oracle 8i, contrainte unique et clé unique étaient d'ailleurs synonymes, d'un point de vue mécanismes, c'était purement la même chose qui était effectuée (car pour vérifier l'unicité, c'est plus rapide si on se base sur un index de toute façon) |
Oui je viens de me rendre compte de la synonymie des deux expressions.
Par ailleurs, je ne vois pas le mal à déclarer une clef primaire sur une chaine de caracteres, c'est juste plus lourd à l'utilisation, mais das le cadre d'un tutoriel ca ne vaut peut etre pas encore la tete sur un simple probleme de performance (et je ne pense pas que ce soit un risque quelconque pour les habitudes). Et il vaut mieux une vraie clef primaire qu'une simple valeur unique qui en possède implicitement tous les attributs (ce que je ne sais pas, c'était une supposition).
Marsh Posté le 18-01-2008 à 14:50:24
vas-y putain il me gonfle ce forum à me bouffer mes postes
donc, je disais...
pour un pays, utiliser le code ISO sur deux lettres comme clé primaire, ou utiliser un code produit en varchar, comme clé primaire, ça ne me pose pas le moindre problème.
en effet, un pays change pas tous les jours de code, pas plus qu'un produit.
en revanche, une désignation, c'est fait pour changer (ne serait-ce que lorsqu'on se rend compte qu'on a fait une faute d'orthographe, ou qu'on a un second produit avec une description similaire et qu'on veut donc les différencier)
et dans ce cas, parcequ'une clé primaire, c'est quelquechose qui ne peut par essence pas changer, ça me pose effectivement un problème majeur d'utiliser une description comme clé primaire.
en revanche, une contrainte d'unicité/index unique, sur une description, cela ne me pose pas le moindre problème : on peut effectivement imposer à l'utilisateur de ne jamais saisir deux descriptions identiques, histoire de s'y retrouver dans le catalogue.
Marsh Posté le 18-01-2008 à 17:58:50
Merci pour toutes vos réponses. En effet comme tu l'as dit Olive une seule contrainte d'unicité suffisait, en réalité j'essayer d'appliquer les exemples du tuto que je lisais à la suite, mais en fait les exemple n'avaient aucuns liens entre eux, c'est pour cela que ma commande ne fonctionnait pas. Merci en tout cas a vous tous.
Marsh Posté le 17-01-2008 à 18:44:09
Re-bonjour à tous, c'est encore le noob. Voilà après plusieurs recherche infructueuses je viens vous exposer le problème qui se pose à moi.
J'aimerais construire une contrainte d'unicité (unique) pour la colonne suivante, déclarée dans ma table Articles: Code,message d'erreur.
Designation VARCHAR2(255) UNIQUE;
et voici la contrainte que je tente d'intégrer à la table Articles:
alter table articles add constraint un_designation designation unique;
ERREUR à la ligne 1 :
ORA-02263: spécification du type de données obligatoire pour cette colonne
J'ai tout essayé:
alter table articles add constraint un_designation unique references articles(designation);
ERREUR à la ligne 1:
ORA-00906: parenthèse de gauche absente
alter table articles add constraint un_designation designation varchar2(255) unique;
ERREUR à la ligne 1 :
ORA-01430: la colonne ajoutée existe déjà dans la table
Comme je suis un noob je ne comprend pas ce qui manque a mon fragment de code. Pour info je suis a la lettre les indications d'un tutoriel (qui soit dit en passant a l'air érroné, mais très complet).
Svp je recquiert votre aide une nouvelle fois. Merci d'avance.