Page 1 sur 1

[RESOLU] Copier une table (commande sql)

Publié : mer. 01/mars/2017 16:20
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

Re: Copier une table (commande sql)

Publié : mer. 01/mars/2017 17:19
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)

Re: Copier une table (commande sql)

Publié : mer. 01/mars/2017 17:48
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

Re: Copier une table (commande sql)

Publié : mer. 01/mars/2017 18:07
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..)

Re: Copier une table (commande sql)

Publié : mer. 01/mars/2017 19:41
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.

Re: Copier une table (commande sql)

Publié : mer. 01/mars/2017 20:13
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??

Re: Copier une table (commande sql)

Publié : jeu. 02/mars/2017 0:37
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.

Re: Copier une table (commande sql)

Publié : jeu. 02/mars/2017 13:28
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:

Re: Copier une table (commande sql)

Publié : jeu. 02/mars/2017 20:23
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.

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

Publié : mer. 08/mars/2017 19:27
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