[RESOLU] Copier une table (commande sql)
[RESOLU] Copier une table (commande sql)
Salut à tous
Je sais comment copier une table vers une autre table en utilisant la méthode classique (comme les débutants), mais je souhaiterais le faire en utilisant une commande SQL (2 ou 3 lignes...) je sais que c'est possible mais je ne connais pas la syntaxe.
Explication détaillée:
J'ai une base de données MaBase.db (chemin complet: c:\data\mabase.db)
J'ai une autre base qui a le même nom et qui se trouve ici : d:\data\mabase.db
Les 2 bases sont identiques et contiennent les mêmes tables. La seule différence, ce sont les données qui ne sont pas toujours les mêmes, raison pour laquelle je veux copier la table (TableClient après chaque mise à jour) vers la table qui porte le même nom et qui se trouve sur la 2 ème base de données. Je crois que Falsam a déjà utilisé ce genre de procédure mais je n'ai pas trouvé son exemple...
Merci
Je sais comment copier une table vers une autre table en utilisant la méthode classique (comme les débutants), mais je souhaiterais le faire en utilisant une commande SQL (2 ou 3 lignes...) je sais que c'est possible mais je ne connais pas la syntaxe.
Explication détaillée:
J'ai une base de données MaBase.db (chemin complet: c:\data\mabase.db)
J'ai une autre base qui a le même nom et qui se trouve ici : d:\data\mabase.db
Les 2 bases sont identiques et contiennent les mêmes tables. La seule différence, ce sont les données qui ne sont pas toujours les mêmes, raison pour laquelle je veux copier la table (TableClient après chaque mise à jour) vers la table qui porte le même nom et qui se trouve sur la 2 ème base de données. Je crois que Falsam a déjà utilisé ce genre de procédure mais je n'ai pas trouvé son exemple...
Merci
Dernière modification par omega le mer. 08/mars/2017 19:28, modifié 1 fois.
Win7 (x64) 64 bits Pb 5.72
Re: Copier une table (commande sql)
Dans quel base SQL ? (SQLite, PostGreSQL etc)
En SQLite, quelquechose comme ceci doit être possible
(pas testé)

En SQLite, quelquechose comme ceci doit être possible
Code : Tout sélectionner
sqlite3 base1.db
> attach database 'base2.db' as backup;
> drop table backup.TableClient;
> create table backup.tableclient as select * from Tableclient;
(pas testé)

- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Copier une table (commande sql)
Omega le souci avec toi c'est que tu poses souvent des questions. On te donne des réponses et la moindre des choses c'est au moins un merci
Exemple avec ce post : http://www.purebasic.fr/french/viewtopi ... 08#p190008

Exemple avec ce post : http://www.purebasic.fr/french/viewtopi ... 08#p190008
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: Copier une table (commande sql)
@falsam
Je ne crois pas Falsam, au contraire, le mot merci est toujours présent dans mes messages AVANT MEME LES REPONSES comme c'est le cas ici et même sur le poste que tu as cité. En général mes questions se terminent toujours par ce mot : merci. Quant aux réponses, ce mot existe toujours aussi sauf dans des cas vraiment exceptionnels... comme le post que tu viens de citer (motif: je n'ai pas encore eu le temps de lire la réponse...), maintenant que je viens juste de le lire, je te remercie falsam et ne sois pas ... fâché... pour ce petit malentendu...
TU N'AS PAS ENCORE REPONDU FALSAM, as tu qq chose de mieux à me proposer ??? (Je te remercie d"avance..)
Je ne crois pas Falsam, au contraire, le mot merci est toujours présent dans mes messages AVANT MEME LES REPONSES comme c'est le cas ici et même sur le poste que tu as cité. En général mes questions se terminent toujours par ce mot : merci. Quant aux réponses, ce mot existe toujours aussi sauf dans des cas vraiment exceptionnels... comme le post que tu viens de citer (motif: je n'ai pas encore eu le temps de lire la réponse...), maintenant que je viens juste de le lire, je te remercie falsam et ne sois pas ... fâché... pour ce petit malentendu...
TU N'AS PAS ENCORE REPONDU FALSAM, as tu qq chose de mieux à me proposer ??? (Je te remercie d"avance..)
Win7 (x64) 64 bits Pb 5.72
- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Copier une table (commande sql)
■ Principe.
-Ouvrir la base de données Source #Database1
-Créer un alias de la base de données Cible #Database2.
Exemple : ReqSql = "ATTACH DATABASE 'Database2.db' AS database2"
Copier Table de Source vers Table de Cible après suppression des enregistrement de Table de Cible.
Exemple : ReqSql = "Delete FROM database2.produits; INSERT INTO database2.produits SELECT * FROM produits"
Fermer la base de données Source.
■ En pratique avec ce petit exemple.
- Création des deux bases de données pour l'exemples (Une source et une cible).Pas grand chose à dire. On crée une base source et une base cible ayant le même schéma structurel.
■ Attaquons le vif du sujet avec ce code suffisamment commenté en deux parties.
- Première partie : Copie de la table produits de la base #Database1 vers la table produits de la base #Database2
- Deuxième partie : Debug de la table produits de la base #Database2Tu peux lancer ce deuxième code plusieurs fois de suite, les identifiant auto sont bien les mêmes.
■ Pour finir.
On indique pas l'alias de la base de données source car elle est déja ouverte.
-Ouvrir la base de données Source #Database1
-Créer un alias de la base de données Cible #Database2.
Exemple : ReqSql = "ATTACH DATABASE 'Database2.db' AS database2"
Copier Table de Source vers Table de Cible après suppression des enregistrement de Table de Cible.
Exemple : ReqSql = "Delete FROM database2.produits; INSERT INTO database2.produits SELECT * FROM produits"
Fermer la base de données Source.
■ En pratique avec ce petit exemple.
- Création des deux bases de données pour l'exemples (Une source et une cible).
Code : Tout sélectionner
Enumeration
#DataBase1
#Database2
EndEnumeration
If CreateFile(#DataBase1, "Database1.db") : CloseFile(#DataBase1) : EndIf
If CreateFile(#DataBase2, "Database2.db") : CloseFile(#DataBase2) : EndIf
UseSQLiteDatabase()
Global ReqSql.s
;1 - Création de la base de données #DataBase1
OpenDatabase(#DataBase1, "Database1.db", "", "", #PB_Database_SQLite)
;Creation de la table produits (trés simplifié)
ReqSql = "CREATE TABLE produits ("
ReqSql + "idauto INTEGER PRIMARY KEY," ;Identification auto
ReqSql + "nom TEXTE," ;Nom du produit
ReqSql + "pu INTEGER" ;Prix unitaire
ReqSql + ");"
DatabaseUpdate(#DataBase1, ReqSql)
;Ajout de deux produits
ReqSql = "INSERT INTO produits (nom, pu) values ("
ReqSql + Chr(34) + "Règle" + Chr(34)+Chr(44) ;Nom du produit
ReqSql + Chr(34) + 10 + Chr(34)+")" ;Montant
DatabaseUpdate(#Database1, ReqSql)
ReqSql = "INSERT INTO produits (nom, pu) values ("
ReqSql + Chr(34) + "Poêle" + Chr(34)+Chr(44) ;Nom du produit
ReqSql + Chr(34) + 9 + Chr(34)+")" ;Montant
DatabaseUpdate(#Database1, ReqSql)
;2 - Création de la base de données #DataBase2
OpenDatabase(#DataBase2, "Database2.db", "", "", #PB_Database_SQLite)
;Creation de la table produits (trés simplifié)
ReqSql = "CREATE TABLE produits ("
ReqSql + "idauto INTEGER PRIMARY KEY," ;Identification auto
ReqSql + "nom TEXTE," ;Nom du produit
ReqSql + "pu INTEGER" ;Prix unitaire
ReqSql + ");"
DatabaseUpdate(#DataBase2, ReqSql)
CloseDatabase(#DataBase1)
CloseDatabase(#Database2)
■ Attaquons le vif du sujet avec ce code suffisamment commenté en deux parties.
- Première partie : Copie de la table produits de la base #Database1 vers la table produits de la base #Database2
- Deuxième partie : Debug de la table produits de la base #Database2
Code : Tout sélectionner
Enumeration
#DataBase1
#Database2
EndEnumeration
Define.s ReqSql
UseSQLiteDatabase()
;Ouverture de la base de données #DataBase1
OpenDatabase(#DataBase1, "Database1.db", "", "", #PB_Database_SQLite)
;Ajouter un alias à #DataBase2
ReqSql = "ATTACH DATABASE 'Database2.db' AS database2"
DatabaseUpdate(#DataBase1, ReqSql)
;Copie de la table produit de #Database1 to #Database2
ReqSql = "Delete FROM database2.produits; INSERT INTO database2.produits SELECT * FROM produits"
DatabaseUpdate(#DataBase1, ReqSql)
Debug DatabaseError()
CloseDatabase(#DataBase1)
;Vérification : Liste des produits base de donnée #Database2
OpenDatabase(#DataBase2, "Database2.db", "", "", #PB_Database_SQLite)
ReqSql = "SELECT idauto, nom, pu FROM produits"
DatabaseQuery(#Database2, ReqSql)
Debug "Liste produits #database2"
While NextDatabaseRow(#Database2)
Debug "Id " + GetDatabaseLong(#Database2, 0) + " Produit : " + GetDatabaseString(#Database2, 1) + " P.U. : " + Str(GetDatabaseLong(#Database2, 2))
Wend
CloseDatabase(#DataBase2)
■ Pour finir.
Delete FROM AliasDatabaseCible.table; INSERT INTO AliasDatabaseCible.produits SELECT * FROM tableOmega a écrit :je souhaiterais le faire en utilisant une commande SQL (2 ou 3 lignes...) je sais que c'est possible mais je ne connais pas la syntaxe.
On indique pas l'alias de la base de données source car elle est déja ouverte.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: Copier une table (commande sql)
Merci beaucoup Falsam
J'a
Je reprends une partie de ton code:
Question :
Pourquoi on indique ici Database1 dans l'instruction DataBaseUpdate, pourtant, c'est bien la table de DataBase2 qui a été modifiée et non pas celle de DataBase1??
J'a
Je reprends une partie de ton code:
Code : Tout sélectionner
;Copie de la table produit de #Database1 to #Database2
ReqSql = "Delete FROM database2.produits; INSERT INTO database2.produits SELECT * FROM produits"
DatabaseUpdate(#DataBase1, ReqSql)
Pourquoi on indique ici Database1 dans l'instruction DataBaseUpdate, pourtant, c'est bien la table de DataBase2 qui a été modifiée et non pas celle de DataBase1??
Win7 (x64) 64 bits Pb 5.72
- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Copier une table (commande sql)
Je comprends, ça peut être perturbant. On va faire l'inverse.
-Au lieu d'ouvrir #Database1 on va ouvrir #Database2.
-L'alias sera #Database1 au lieu de #Database2Tu remarqueras que #Database1 ,n'a pas été ouvert.
-Au lieu d'ouvrir #Database1 on va ouvrir #Database2.
-L'alias sera #Database1 au lieu de #Database2
Code : Tout sélectionner
Enumeration
#DataBase1
#Database2
EndEnumeration
Define.s ReqSql
UseSQLiteDatabase()
;Ouverture de la base de données #DataBase2
OpenDatabase(#DataBase2, "Database2.db", "", "", #PB_Database_SQLite)
;Ajouter un alias à #DataBase1
ReqSql = "ATTACH DATABASE 'Database1.db' AS database1"
DatabaseUpdate(#DataBase2, ReqSql)
;Copie de la table produit de #Database1 to #Database2
ReqSql = "Delete FROM produits; INSERT INTO produits SELECT * FROM database1.produits"
DatabaseUpdate(#DataBase2, ReqSql)
Debug DatabaseError()
CloseDatabase(#DataBase2)
;Vérification : Liste des produits base de donnée #Database2
OpenDatabase(#DataBase2, "Database2.db", "", "", #PB_Database_SQLite)
ReqSql = "SELECT idauto, nom, pu FROM produits"
DatabaseQuery(#Database2, ReqSql)
Debug "Liste produits #database2"
While NextDatabaseRow(#Database2)
Debug "Id " + GetDatabaseLong(#Database2, 0) + " Produit : " + GetDatabaseString(#Database2, 1) + " P.U. : " + Str(GetDatabaseLong(#Database2, 2))
Wend
CloseDatabase(#DataBase2)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: Copier une table (commande sql)
Pour intervenir sur deux bases en même temps, on en ouvre d'abord une et on attache l'autre avec un aliasomega a écrit : Question :
Pourquoi on indique ici Database1 dans l'instruction DataBaseUpdate, pourtant, c'est bien la table de DataBase2 qui a été modifiée et non pas celle de DataBase1??
D'où la commande attach database
Tout est expliqué dans les commentaires de Falsam
PS. Pour vider totalement une table, DROP TABLE va plus vite que DELETE FROM (même si cela ne se voit pas pour de petites tables)

Re: Copier une table (commande sql)
Merci beaucoup, je viens aussi de découvrir qq chose de nouveau :
ATTACH DATABASE
Je vais faire des tests avec cette instruction.
Merci encore.
ATTACH DATABASE
Je vais faire des tests avec cette instruction.
Merci encore.
Win7 (x64) 64 bits Pb 5.72
[RESOLU] Re: Copier une table (commande sql)
omega a écrit :Salut à tous
Je sais comment copier une table vers une autre table en utilisant la méthode classique (comme les débutants), mais je souhaiterais le faire en utilisant une commande SQL (2 ou 3 lignes...) je sais que c'est possible mais je ne connais pas la syntaxe.
Explication détaillée:
J'ai une base de données MaBase.db (chemin complet: c:\data\mabase.db)
J'ai une autre base qui a le même nom et qui se trouve ici : d:\data\mabase.db
Les 2 bases sont identiques et contiennent les mêmes tables. La seule différence, ce sont les données qui ne sont pas toujours les mêmes, raison pour laquelle je veux copier la table (TableClient après chaque mise à jour) vers la table qui porte le même nom et qui se trouve sur la 2 ème base de données. Je crois que Falsam a déjà utilisé ce genre de procédure mais je n'ai pas trouvé son exemple...
Merci
Win7 (x64) 64 bits Pb 5.72