[RESOLU] Copier une table (commande sql)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
omega
Messages : 633
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

[RESOLU] Copier une table (commande sql)

Message par omega »

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
Dernière modification par omega le mer. 08/mars/2017 19:28, modifié 1 fois.
Win7 (x64) 64 bits Pb 5.72
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Copier une table (commande sql)

Message par Marc56 »

Dans quel base SQL ? (SQLite, PostGreSQL etc)

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é)

8)
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Copier une table (commande sql)

Message par falsam »

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 :wink:

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%
Avatar de l’utilisateur
omega
Messages : 633
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Re: Copier une table (commande sql)

Message par omega »

@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..)
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Copier une table (commande sql)

Message par falsam »

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

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)
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 #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)
Tu peux lancer ce deuxième code plusieurs fois de suite, les identifiant auto sont bien les mêmes.

Pour finir.
Omega 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.
Delete FROM AliasDatabaseCible.table; INSERT INTO AliasDatabaseCible.produits SELECT * FROM table
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%
Avatar de l’utilisateur
omega
Messages : 633
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Re: Copier une table (commande sql)

Message par omega »

Merci beaucoup Falsam

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)
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??
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Copier une table (commande sql)

Message par falsam »

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 #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)
Tu remarqueras que #Database1 ,n'a pas été ouvert.
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%
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Copier une table (commande sql)

Message par Marc56 »

omega 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??
Pour intervenir sur deux bases en même temps, on en ouvre d'abord une et on attache l'autre avec un alias
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)

:wink:
Avatar de l’utilisateur
omega
Messages : 633
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Re: Copier une table (commande sql)

Message par omega »

Merci beaucoup, je viens aussi de découvrir qq chose de nouveau :

ATTACH DATABASE

Je vais faire des tests avec cette instruction.

Merci encore.
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
omega
Messages : 633
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

[RESOLU] Re: Copier une table (commande sql)

Message par omega »

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
Répondre