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