Bonjour à tous
Je dois modifier une table de ma base de données mais il y a dans d'autres tables de ma base des clé étrangères qui pointent sur cette table.
J'utilise en FDConnection relié à ma base de données et un FDQuery pour les requêtes.
Je sais qu'en SQLite on ne peux pas modifier la table directement, on dois passer par une copie de la table. Mais lorsque je fais une copie de ma table pour pouvoir ensuite la recréer avec les modifications, les clé étrangères des autres tables pointent sur la table sauvegardé et non la nouvelle.
J'ai pas mis toutes les tables de ma base mais seules celles qui nous intéresse
Pour mes Modifications je désire ajouter une table PMID contenant un Identifiant, le PMID qui est un identifiant dans une base de données de publications en ligne et un booléen pour marquer que cet article est une publications ou non de notre laboratoire.
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
21
22
23
24
25
26
27
28
29
30
31
32
33 // Article CREATE TABLE IF NOT EXISTS 'Article' ( 'idArticle' INTEGER PRIMARY KEY NOT NULL, 'PMID' INTEGER, 'TitreArticle' TEXT NOT NULL, 'idJournal' INTEGER NOT NULL, 'idAnnee' INTEGER NOT NULL, 'MoisDebut' INTEGER, 'MoisFin' INTEGER, 'Jour' INTEGER, 'Volume' TEXT NOT NULL, 'Issue' TEXT NOT NULL, 'Pagination' TEXT, 'Citation' INTEGER NOT NULL, FOREIGN KEY ('idJournal') REFERENCES 'Journal'('idJournal'), FOREIGN KEY ('idAnnee') REFERENCES 'Annee'('idAnnee')) // AuteurArticle CREATE TABLE IF NOT EXISTS 'AuteurArticle' ( 'idArticle' INTEGER NOT NULL, 'idAuteur' INTEGER NOT NULL, 'idNom' INTEGER NOT NULL, 'idInitiale' INTEGER, 'Position' INTEGER NOT NULL, CONSTRAINT PK_AuteurArticle PRIMARY KEY ('idArticle', 'idAuteur', 'idNom', 'IdInitiale') FOREIGN KEY ('idArticle') REFERENCES 'Article'('idArticle') FOREIGN KEY ('idAuteur') REFERENCES 'Auteur'('idAuteur') CONSTRAINT FK_NomAuteurArticle FOREIGN KEY ('idAuteur', 'IdNom') REFERENCES 'NomAuteur'('idAuteur', 'idNom'), CONSTRAINT FK_InitialeAuteurArticle FOREIGN KEY ('idAuteur', 'IdInitiale') REFERENCES 'InitialeAuteur'('idAuteur', 'idInitiale'))
Je crée donc la table PMID comme suit par code mais je vous met seulement le schéma
Je remplis ensuite ma table PMID avec les PMID contenu dans la table Article, en leur attribuant un Id pour ma base.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 CREATE TABLE IF NOT EXISTS 'PMID' ( 'idPMID' INTEGER NOT NULL PRIMARY KEY, 'PMID' INTEGER NOT NULL, 'Laboratoire' INTEGER NOT NULL)
Je renomme ma table Article en ArticleSave
Ensuite j'extrais chaque enregistrement de ma table Article dans une liste d'article.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Requete = "ALTER TABLE Article RENAME TO ArticleSave"; // On charge la requete dans la Query FDQuery->SQL->Text = Requete; // On exécute la requete FDQuery->Execute();
puis je récupère pour chaque Article l'ID du PMID dans la nouvelle table PMID.
Je crée ma nouvelle table Article
Ensuite je remplis ma table Article avec les enregistrements de ma liste d'articles. (Je vous passe le remplissage)
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
21
22
23 Requete = "CREATE TABLE IF NOT EXISTS 'Article' ("; Requete += "'idArticle' INTEGER PRIMARY KEY NOT NULL,"; Requete += "'idPMID' INTEGER, "; Requete += "'TitreArticle' TEXT NOT NULL, "; Requete += "'idJournal' INTEGER NOT NULL, "; Requete += "'idAnnee' INTEGER NOT NULL, "; Requete += "'MoisDebut' INTEGER, "; Requete += "'MoisFin' INTEGER, "; Requete += "'Jour' INTEGER, "; Requete += "'Volume' TEXT NOT NULL, "; Requete += "'Issue' TEXT NOT NULL, "; Requete += "'Pagination' TEXT, "; Requete += "'Citation' INTEGER NOT NULL, "; Requete += "FOREIGN KEY ('idPMID') REFERENCES 'PMID'('idPMID'), "; Requete += "FOREIGN KEY ('idJournal') REFERENCES 'Journal'('idJournal'), "; Requete += "FOREIGN KEY ('idAnnee') REFERENCES 'Annee'('idAnnee'))"; // On charge la requete FDQuery->SQL->Text = Requete; // On Exécute la requete FDQuery->Execute();
Après avoir poser le contexte, on arrive au problème que je rencontre.
Voici ma table AuteurArticle après ces modifications comme je la vois dans DbBrower :
En cherchant sur le net, j'ai vu qu'on pouvait utiliser les commandes suivantes en SQLite pour activer ou désactiver les clés Etrangères et ainsi pouvoir modifier mes tables sans que les clé étrangères changement.
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 // AuteurArticle CREATE TABLE IF NOT EXISTS 'AuteurArticle' ( 'idArticle' INTEGER NOT NULL, 'idAuteur' INTEGER NOT NULL, 'idNom' INTEGER NOT NULL, 'idInitiale' INTEGER, 'Position' INTEGER NOT NULL, CONSTRAINT PK_AuteurArticle PRIMARY KEY ('idArticle', 'idAuteur', 'idNom', 'IdInitiale') FOREIGN KEY ('idArticle') REFERENCES 'ArticleSave'('idArticle') FOREIGN KEY ('idAuteur') REFERENCES 'Auteur'('idAuteur') CONSTRAINT FK_NomAuteurArticle FOREIGN KEY ('idAuteur', 'IdNom') REFERENCES 'NomAuteur'('idAuteur', 'idNom'), CONSTRAINT FK_InitialeAuteurArticle FOREIGN KEY ('idAuteur', 'IdInitiale') REFERENCES 'InitialeAuteur'('idAuteur', 'idInitiale'))
J'ai exécuté ces commandes via un appelle à FDQuery mais cela n'a aucun résultat.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 PRAGMA foreign_keys=OFF; PRAGMA foreign_keys=ON;
Du coup pour l'instant je dois faire des copies de toutes mes tables ayant une clé étrangère qui pointe vers la table Article.
Savez-vous s'il existe une commande en FireDac pour pouvoir activer ou désactiver les clé étrangères
Merci d'avance pour votre aide et dsl pour le pavé
Partager