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

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'))
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.

Je crée donc la table PMID comme suit par code mais je vous met seulement le schéma

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 remplis ensuite ma table PMID avec les PMID contenu dans la table Article, en leur attribuant un Id pour ma base.

Je renomme ma table Article en ArticleSave

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();
Ensuite j'extrais chaque enregistrement de ma table Article dans une liste d'article.
puis je récupère pour chaque Article l'ID du PMID dans la nouvelle table PMID.

Je crée ma nouvelle table Article

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();
Ensuite je remplis ma table Article avec les enregistrements de ma liste d'articles. (Je vous passe le remplissage)

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 :

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'))
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
 
PRAGMA foreign_keys=OFF;
PRAGMA foreign_keys=ON;
J'ai exécuté ces commandes via un appelle à FDQuery mais cela n'a aucun résultat.

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é