Bonjour,
Mon problème est assez simple à expliquer, mais je n'ai pas de solution.
Je développais une application java jdbc classique, interagissant avec une bdd mysql (l'application se connecte à un serveur mysql pour interroger et modifier la base).
J'aimerais passer cette application en standalone, et il apparait que Derby est conçu (entre autres) pour ce cas de figure, c'est pourquoi j'ai décider de migrer ma base de données mysql vers une nouvelle base java (derby).
Après avoir adapté à la syntaxe sql de derby le script sql généré par phpmyadmin pour le dump, je tombe sur le problème suivant :
J'ai une table pièce, et une table ouverture.
Une pièce peut avoir plusieurs ouvertures, et une ouverture peut avoir de 0 à 2 pièces. (une à deux pièces dans les faits, mais j'ai décidé de gérer cette contrainte au niveau logiciel).
Pour cela, un enregistrement de la table ouverture référence un ou deux enregistrements dans la table pièce à l'aide de une ou deux clés étrangères.
A la création de la base, cela nous fait donc spécifier deux contraintes quasi identiques.
Voici le code correspondant à cette modélisation :
Création des tables :
Contraintes liées :
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 CREATE TABLE piece ( idPiece int NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), designation varchar(30) DEFAULT NULL, surface decimal(5,2) DEFAULT NULL, PRIMARY KEY (idPiece)); CREATE TABLE ouverture ( idOuverture int NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), nomOuverture varchar(30) DEFAULT NULL, surfaceOuv decimal(5,2) DEFAULT NULL, direction varchar(10) DEFAULT NULL, idPiece1 int DEFAULT NULL, idPiece2 int DEFAULT NULL, PRIMARY KEY (idOuverture), CONSTRAINT orientation_chck CHECK (direction IN ('NORD','SUD','EST','OUEST','NORDEST','NORDOUEST','SUDEST','SUDOUEST'))) ;
Je compte créer la BDD à la mano pour l'embarquer dans mon jar, j'utilise donc l'utilitaire ij ou pour exécuter les scripts de création de table.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 -- -- Contraintes pour la table `ouverture` -- ALTER TABLE ouverture ADD CONSTRAINT ouverture_ibfk_1 FOREIGN KEY (idPiece1) REFERENCES piece (idPiece) ON DELETE SET NULL ON UPDATE NO ACTION; ALTER TABLE ouverture ADD CONSTRAINT ouverture_ibfk_2 FOREIGN KEY (idPiece2) REFERENCES piece (idPiece) ON DELETE SET NULL ON UPDATE NO ACTION;
A la création, la première contrainte de la table "ouverture" passe, mais pas la deuxième.
L'utilitaire ij me retourne un message d'erreur :
Le message est censé être clair, mais j'avoue être un peu perdu....ERREUR 42915 : La clé externe 'OUVERTURE_IBFK_2' n'est pas valide car 'La table ne peut pas être définie comme étant dépendante de la table APP.PIECE en raison des limitations de la règle de suppression. Dans le cadre de la relation, une dépendance en cas de suppression s'établit entre cette table et la table indiquée en vertu de plusieurs relations et la règle de suppression de la relation existante est SET NULL. '.
Ce message semble indiquer que cette erreur est générée à cause de la clause ON DELETE SET NULL, mais la premiere contrainte (concernant la clé étrangère "idpièce1") comporte exactement la même clause sur exactement le même type de clé étrangère.
Merci pour tout éclaircissement que vous jugeriez utile
Partager