IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Syntaxe de CHECK dans un CREATE TABLE


Sujet :

Requêtes MySQL

  1. #1
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut Syntaxe de CHECK dans un CREATE TABLE
    Bonjour,
    Un truc que je n'ai encore jamais utilisé : la contrainte CHECK dans une création ou une modification de table.

    Mon besoin :
    J'ai une table qui a deux clés étrangères pointant sur la même table et je souhaite spécifier que les deux clés doivent avoir une valeur différente.
    Je pense à la syntaxe suivante mais est-elle bonne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE TABLE ...
    CHECK C_FK_IdAttaquant <> C_FK_IdDefenseur
    Question subsidiaire : Si quelqu'un sait comment inscrire cette contrainte directement dans MySQL Workbench je le remercie d'avance.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  2. #2
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Citation Envoyé par CinePhil Voir le message
    J'ai une table qui a deux clés étrangères pointant sur la même table et je souhaite spécifier que les deux clés doivent avoir une valeur différente.
    Je pense à la syntaxe suivante mais est-elle bonne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE TABLE ...
    CHECK C_FK_IdAttaquant <> C_FK_IdDefenseur
    MySQL ne gère pas nativement ce genre de contrainte à ma connaissance.
    Par contre, ça doit pouvoir se faire via un trigger.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    MySQL ne gère pas nativement ce genre de contrainte à ma connaissance.
    D'après la doc c'est prévu pour les tables de type Inno db et c'est ce que j'utilise pour avoir les contraintes de clés étrangères contrôlées par la BDD.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Désolé, il faut que je change de lunettes.
    A mon corps défendant, je suis plutôt allé consulter la doc du côté de http://dev.mysql.com/doc/refman/5.0/...nstraints.html où il n'en dise pas un mot.
    Plus généralement j'ai parcouru cette partie de la doc (accès par l'Index) http://dev.mysql.com/doc/refman/5.0/fr/constraints.html sans trouver la moindre référence à la syntaxe de CHECK dans la définition d'une contrainte.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    J'ai appelé ça 'contrainte' en français mais effectivement d'après la doc ce n'est pas une 'CONSTRAINT'.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 741
    Points
    11 741
    Par défaut
    Si vous lisez de très près (voire même entre les lignes), vous devriez conclure comme moi que les CHECK ne sont pas implémentés (même s'ils sont acceptés), ni par InnoDB, ni par un autre moteur.

    Citation Envoyé par doc MySQL
    En MySQL version 3.23.44 et plus récent, les tables InnoDB supportent la vérification de clé étrangères. See Chapitre 15, Le moteur de tables InnoDB. Notez que la syntaxe des clés étrangères FOREIGN KEY de InnoDB est plus restrictive que la syntaxe présentée ci-dessus. InnoDB ne permet pas la spécification d'un index_name, et les colonnes de la table référencée doivent être explicitement nommées. Depuis la version 4.0.8, InnoDB supporte les clauses ON DELETE et ON UPDATE avec les clés étrangères. Voyez le manuel InnoDB pour la syntaxe précise. Section 15.7.4, « Contraintes de clés étrangères FOREIGN KEY ».

    Pour les autres types de tables, le serveur MySQL n'analyse pas les clauses FOREIGN KEY, CHECK et REFERENCES dans les commandes CREATE TABLE, et aucune action n'est réalisée. See Section 1.5.5.5, « Les clés étrangères ».
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  7. #7
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Citation Envoyé par Antoun Voir le message
    Pour les autres types de tables, le serveur MySQL n'analyse pas les clauses FOREIGN KEY, CHECK et REFERENCES dans les commandes CREATE TABLE, et aucune action n'est réalisée. See Section 1.5.5.5, « Les clés étrangères ».
    Je comprends plutôt que cela n'est pas implémenté dans les tables qui ne sont pas de type InnoDB, (les autres types de tables) et donc que cela l'est dans celles-ci.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 741
    Points
    11 741
    Par défaut
    Remonte d'un paragraphe !
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  9. #9
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    Je suis d'accord avec Maljuna Kris. Le premier paragraphe parle des tables InnoDB et des CONSTRAINT FOREIGN KEY et le second dit que pour les autres tables (pas InnoDB donc) :
    le serveur MySQL n'analyse pas les clauses FOREIGN KEY, CHECK et REFERENCES
    Donc pour InnoDB il les analyse !

    Je verrai bien, je n'en suis pas encore à l'implémentation.

    Pas d'idée pour insérer mon CHECK directement dans MySQL Workbench ?
    Comme l'implémentation se fera via un fichier SQL parce que je n'ai pas la version complète, je pourrai toujours modifier le dit fichier à la main pour rajouter les clauses manquantes mais si ça pouvait être automatique ce serait mieux.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  10. #10
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 741
    Points
    11 741
    Par défaut
    Puisque vous vous laissez avoir par la traduction, passez à la version anglaise :

    The CHECK clause is parsed but ignored by all storage engines.
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  11. #11
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    OK. C'est confirmé par la doc sur ALTER TABLE :
    La clause CHECK est analysée mais ignorée par tous les moteurs de stockage. See Section 13.2.5, « Syntaxe de CREATE TABLE ». La raison pour accepter mais ignorer ces clauses est que cela renforce la compatibilité avec le code des autres serveurs SQL, et qu'il est possible de créer des tables avec des références. See Section 1.5.5, « Différences entre MySQL et le standard SQL-92 ».
    Je viens de tester.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE test
    ADD CONSTRAINT CHECK col2 <> col3
    C'est accepté par MySQL mais ensuite si j'insère une ligne violant cette contrainte, la ligne est acceptée.

    Et il s'agit bien d'une CONSTRAINT parce que la syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER  TABLE test 
    CHECK col1 <> col2
    est refusée par MySQL.

    Il faudrait que MySQL accorde sa doc entre les différents chapitres, ainsi que les traductions !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  12. #12
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    La traduction de la doc en espagnol semble plus fidèle que celle en français
    Para otros motores de almacenamiento, MySQL Server parsea la sintaxis FOREIGN KEY y REFERENCES en comandos CREATE TABLE , pero no hace nada. La cláusula CHECK se parsea pero se ignora en todos los motores de almacenamiento.
    Il ne me reste plus qu'à en proposer une en espéranto
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  13. #13
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    Je réactive ce sujet parce que je reprends ce projet qui était quelque peu en sommeil...

    Donc j'aimerais toujours implanter une contrainte CHECK qui n'est malheureusement pas prise en compte par MySQL.

    Il parait qu'on peut faire ça avec un trigger. Comme je n'en ai jamais encore utilisé, je tâtonne un peu.
    Est-ce que la syntaxe ci-dessous vous paraît correcte ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE TRIGGER ctrlAttaqDef BEFORE INSERT ON Combats
    FOR EACH ROW Co_IdAttaquant <> Co_IdDefenseur
    PS :
    Dans MySQL Workbench, dans l'onglet où on peut écrire les triggers, il y a ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    -- Trigger DDL Statements
    USE `swing`;
    DELIMITER //
    Est-il utile ?
    Je comprends qu'il commence par dire d'utiliser le schéma 'swing' mais à quoi sert le DELIMITER ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  14. #14
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 741
    Points
    11 741
    Par défaut
    Le problème est qu'il n'y a pas de moyen direct d'annuler l'ordre en cours dans un trigger. L'astuce habituelle consiste à provoquer une erreur, par exemple en mettant une colonne obligatoire à NULL... kazou a très bien traité le problème : http://alain-defrance.developpez.com...integre-error/

    (l'histoire du DELIMITER y est également expliquée)
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  15. #15
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    Si j'ai bien compris ce que dit le tutoriel, un trigger tel que ci-dessous permettrait d'empêcher l'insertion en générant une erreur par MySQL, à charge du programme applicatif de se débrouiller avec pour la gérer ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    USE `swing`;
    DELIMITER //
     
    CREATE TRIGGER TR_AttaqDef
    BEFORE INSERT
    ON Combats
    FOR EACH ROW
    BEGIN
        DECLARE IdDefenseur MEDIUMINT;
     
        SELECT O_FK_IdJoueur INTO IdDefenseur
        FROM ObjetSpatiaux
        WHERE O_Id = NEW.Co_FK_IdObjetDefenseur;
     
        IF IdDefenseur = NEW.Co_FK_IdAttaquant THEN
            SET NEW.CO_FK_IdAttaquant = NULL;
            SET NEW.CO_FK_IdObjetDefenseur = NULL;
        END IF;
    END;
    //
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. Exclusion colonne dans SHOW CREATE TABLE
    Par bugbug dans le forum Requêtes
    Réponses: 1
    Dernier message: 18/04/2014, 22h26
  2. Utilisation du mot clé VALUE dans un CREATE TABLE
    Par mathiaschoquet dans le forum SQL
    Réponses: 7
    Dernier message: 20/01/2012, 14h12
  3. Syntax CREATE TABLE
    Par Muffyn dans le forum Access
    Réponses: 5
    Dernier message: 14/09/2006, 14h05
  4. [8i] Parrallel_clause dans CREATE TABLE
    Par ducho dans le forum Oracle
    Réponses: 2
    Dernier message: 14/02/2006, 16h27
  5. Syntaxe CREATE Table et option "Chaine vide au
    Par leteltel dans le forum Access
    Réponses: 2
    Dernier message: 10/02/2006, 17h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo