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 :

Erreur #1901 lors de l'import d'une base [MariaDB]


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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut Erreur #1901 lors de l'import d'une base
    Bonjour,
    Je suis confronté à une erreur bizarre !

    Je tente d'importer, via phpMyAdmin, sur mon poste (mariadb Ver 15.1 Distrib 10.11.6-MariaDB, for Linux (x86_64) using readline 5.1) une BDD sauvegardée d'un serveur (mariadb Ver 15.1 Distrib 10.6.15-MariaDB, for Linux (x86_64) using EditLine wrapper) pour tester un patch SQL avant de le passer sur le serveur.

    L'import plante sur une table contenant une contrainte CHECK :
    Citation Envoyé par MariaDB
    Erreur

    Analyse statique :

    4 erreurs trouvées lors de l'analyse.

    Un nom de symbole était attendu ! Un mot clé réservé ne peut pas servir comme nom de colonne sans les apostrophes inverses. (near "CHECK" at position 1090)
    Début d'énoncé inattendu. (near "`psb_id_specialite1`" at position 1097)
    Début d'énoncé inattendu. (near "`psb_id_specialite2`" at position 1121)
    Type d'énoncé non reconnu. (near "ENGINE" at position 1145)

    Requête SQL : Copier

    CREATE TABLE `th_pdi_specialites_bac_psb` ( `psb_id_etudiant` int(11) NOT NULL COMMENT 'Identifiant de l''étudiant', `psb_id_bac` int(11) NOT NULL COMMENT 'Identifiant du baccalauréat', `psb_id_specialite1` tinyint(4) NOT NULL COMMENT 'Identifiant de la spécialité 1', `psb_id_specialite2` tinyint(4) NOT NULL COMMENT 'Identifiant de la spécialité 2', PRIMARY KEY (`psb_id_etudiant`,`psb_id_bac`,`psb_id_specialite1`,`psb_id_specialite2`), KEY `x_psb_id_specialite1` (`psb_id_specialite1`), KEY `x_psb_id_specialite2` (`psb_id_specialite2`), CONSTRAINT `fk_psb_id_specialite1` FOREIGN KEY (`psb_id_specialite1`) REFERENCES `referentiel`.`tr_specialite_bac_spb` (`spb_id`) ON UPDATE CASCADE, CONSTRAINT `fk_psb_id_specialite2` FOREIGN KEY (`psb_id_specialite2`) REFERENCES `referentiel`.`tr_specialite_bac_spb` (`spb_id`) ON UPDATE CASCADE, CONSTRAINT `fk_psb_passage_diplome` FOREIGN KEY (`psb_id_etudiant`, `psb_id_bac`) REFERENCES `te_passage_diplome_pdi` (`pdi_id_etudiant`, `pdi_id_diplome`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `ck_psb_spe1_diff_spe2` CHECK (`psb_id_specialite1` <> `psb_id_specialite2`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Spécialités associées au passage du baccalauréat français obtenu par un étudiant à partir de 2021';

    MySQL a répondu : Documentation
    #1901 - Function or expression 'psb_id_specialite1' cannot be used in the CHECK clause of `ck_psb_spe1_diff_spe2`
    L'explication de l'erreur est pour le moins étrange puis que les apostrophes inversées figurent bien dans la requête, qu'il n'y a pas de nom d'objet égal à un mot clé SQL et que 'psb_id_specialite1' n'est pas une fonction mais un nom de colonne !

    Du coup l'import est arrêté sur cette erreur et il y a encore quelques dizaines de tables procédures à importer après ça !

    Et du coup je ne peux pas tester mon patch SQL !
    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
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    J'ai commenté la contrainte CHECK dans le script d'import de la BDD et j'ai pu finir l'import.

    Par contre, si j'essaie maintenant d'ajouter la contrainte, j'ai la même erreur :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ALTER TABLE pef.th_pdi_specialites_bac_psb
    ADD CONSTRAINT ck_psb_spe1_diff_spe2
    		CHECK (psb_id_specialite1 <> psb_id_specialite2);

    Et voici ce que raconte phpMyAdmin à propos de l'erreur :
    Citation Envoyé par MariaDB
    Erreur

    Analyse statique :

    1 erreurs trouvées lors de l'analyse.

    Un nouvel énoncé a été trouvé, mais il n'y a aucun délimiteur entre celui-ci et le précédent. (near "CHECK" at position 84)

    Requête SQL : Copier

    ALTER TABLE pef.th_pdi_specialites_bac_psb ADD CONSTRAINT ck_psb_spe1_diff_spe2 CHECK (psb_id_specialite1 <> psb_id_specialite2);

    MySQL a répondu : Documentation
    #1901 - Function or expression 'psb_id_specialite1' cannot be used in the CHECK clause of `ck_psb_spe1_diff_spe2`
    Pourtant, ma syntaxe semble correcte en regard de ce que dit MariaDB dans son manuel :
    Citation Envoyé par MariaDB
    Adding check constraints to an existing table

    The alter table add constraint statement allows you to add a check constraint to an existing table:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    alter table table_name
    add constraint constraint_name 
    check(expression);
    For example, the following example adds a check constraint to the classes table:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    alter table classes
    add constraint valid_begin_date 
    check(begin_date >= '2019-01-01');
    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 !

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 910
    Points
    38 910
    Billets dans le blog
    9
    Par défaut
    Bonjour Philippe,

    Le dernier message d'erreur est fonction ou expression, ici c'est "expression" qu'il faut retenir.
    J'ai copié collé le script sur db-fiddle avec Mysql V8.0 et j'ai la même erreur sur la contrainte "check", si je l'enlève, le script passe
    Ce qui boque c'est que la colonne qui fait l'objet de la contrainte CHECK fasse aussi l'objet d'une contrainte REFERENCE avec des instructions ON UPDATE/DELETE.

    Cf. cet extrait du manuel de référence :

    Foreign key referential actions (ON UPDATE, ON DELETE) are prohibited on columns used in CHECK constraints. Likewise, CHECK constraints are prohibited on columns used in foreign key referential actions.
    L'intégralité ICI

    Par contre, sous MariaDB 10, ça semble passer, mais je vois que tes messages d'erreur commencent par "MySQL a répondu", du coup je m'interroge sur le SGBD cible.

  4. #4
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Merci Escartefigue ; je n'avais pas vu ce détail dans la doc... parce que celle de MariaDB n'en parle pas (ou alors ailleurs ?)

    Il s'agit bien intégralement de MariaDB mais avec deux versions différentes entre le serveur et ma machine, comme indiqué dans mon premier message.

    La table avec sa contrainte a été créée, de mémoire, il y a plus d'un an, sans problème. Il semble que ce soit ma version plus récente de MariaDB qui refuse ça désormais.

    Encore une lacune de MySQL/MariaDB ?

    On va donc dire que le problème est résolu puisque l'absence de la contrainte n'est pas un problème pour mon test de patch qui, lui, était bon. J'ai appliqué le patch en prod sur le serveur.
    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 !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Une erreur étrange lors de l'importation d'une bdd
    Par binco dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 09/06/2015, 10h37
  2. erreur 1142 lors de l'import de la base de donnée
    Par geoffreyconversons dans le forum MySQL
    Réponses: 5
    Dernier message: 19/05/2015, 12h16
  3. [WD15] Probmème lors de l importation d'une base de données
    Par ellyam dans le forum WinDev
    Réponses: 2
    Dernier message: 31/05/2012, 11h28
  4. Erreur lors de l'importation d'une tables xls
    Par joyeux_lapin13 dans le forum SAS Base
    Réponses: 5
    Dernier message: 02/02/2012, 13h32
  5. Réponses: 2
    Dernier message: 05/05/2007, 10h05

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