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�