"Fusion " de 2 tables en MySQL

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

Débutant en SQL je requiers votre aide pour ce problème:

Je dispose de deux tables table1(id: int autoincrement primary_key, arg1, arg2, …) et table2 possédant exactement la même structure. Je souhaite créer une table3 formée des lignes de table1 et de table2

Cependant la requête :

CREATE TABLE table3 (structure précédente);
INSERT INTO table3 (SELECT * FROM table1);
INSERT INTO table3 (SELECT * FROM table2);

n’aboutit pas, car il y a un problème d’identifiant. id est une clé primaire, et ajouter les éléments de table2 ferait qu’il y aurait deux id=1.

Comment faire pour que table3 soit constituée de table1 et table2 à la suite, les identifiants s’enchaînant ?

Un jour j’irai vivre en Théorie, car en Théorie tout se passe bien. Desproges

+0 -0

Cette réponse a aidé l’auteur du sujet

Salut,

En listant les champs tout en omettant la clé primaire, ça ne marche pas? Je n’ai jamais eu à le faire donc c’est à l’aveugle. Cela donnerait un truc du genre:

INSERT INTO table3 (arg1, arg2) VALUES (SELECT arg1, arg2 FROM table1);

Édité par Fumble

Fumble’s Dev Center v1.0 - Secrétaire de Zeste de Savoir - Sharleen <3 - Áfram Ísland ! - Commander Shepard true fan

+1 -0
Auteur du sujet

Salut, ça fonctionne mieux qu’avant. J’ai retiré le mot VALUES qui provoquait une erreur de syntaxe,

Maintenant tout s’affiche à la suite, mais dans la BDD que j’ai construite pour tester, l’ID du dernier élément de table1 est 24 (normal), celui du premier élément de table2 est 32, il y a un trou de 8 cases mais tout a bien été recopié. Une idée pour qu’il n’y ait pas ce trou ?

Merci :)

(EDIT) Y-a-t-il simplement une commande pour réindexer ?

(EDIT 2) après rapide recherche,

SET  @num := 0; 
UPDATE table3 SET id= @num := (@num+1); 
ALTER TABLE table3 AUTO_INCREMENT =1; 

a fonctionné, les données restent cohérentes et bien organisées de id = 1 à id = id_max(table1) + id_max(table2).

Édité par MichelPro

Un jour j’irai vivre en Théorie, car en Théorie tout se passe bien. Desproges

+0 -0

Cette réponse a aidé l’auteur du sujet

Maintenant tout s’affiche à la suite, mais dans la BDD que j’ai construite pour tester, l’ID du dernier élément de table1 est 24 (normal), celui du premier élément de table2 est 32, il y a un trou de 8 cases mais tout a bien été recopié. Une idée pour qu’il n’y ait pas ce trou ?

Ce n’est pas un problème. Un ID d’une table doit être un ID technique, et doit donc pouvoir prendre n’importe quelle valeur (tant que l’unicité est garantie) sans que ça pose le moindre problème au bon fonctionnement de l’application.

En particulier, l’application ne doit jamais supposer que :

  • les IDs sont strictement croissants dans l’ordre d’insertion.
  • les IDs sont continus.
Auteur du sujet

En particulier, l’application ne doit jamais supposer que :

  • les IDs sont strictement croissants dans l’ordre d’insertion.
  • les IDs sont continus.
SpaceFox

OK, j’enregistre, à vrai dire ça ne me pose pas de problème.

Imaginons que je doive tirer au sort une ligne d’une table (à laquelle on accède depuis php, python, peu importe); on ne peut donc pas directement tirer un id au sort. Quelle méthode préférer : sql.rand ou bien une suite incrémentée située dans une colonne "non primaire" ?

Bonne fin de journée :)

Édité par MichelPro

Un jour j’irai vivre en Théorie, car en Théorie tout se passe bien. Desproges

+0 -0

SET @num := 0; UPDATE table3 SET id= @num := (@num+1); ALTER TABLE table3 AUTO_INCREMENT =1;

Ne renumérote jamais les ID. Ca ne se fait tout simplement pas. Toutes les clés étrangères qui faisaient référence à ces ID seront faux, et donc tu auras des données corrompues.

Quelle méthode préférer : sql.rand ou bien une suite incrémentée située dans une colonne "non primaire" ?

En conséquence de ma réponse, de celle donnée par spacefox et celles de l’article, je te déconseille aussi de choisir un ID au hasard. Crée une colonne exprès pour ça, non primaire mais indexée.

select * from table where colonne_numero = X
sera encore plus rapide que
select * from table limit X, 1
car dans certaines implémentations, limit peut toute de même nécéssiter de parcourir toute la table (limit étant appliqué après avoir remonté tous les résultats). Pour en avoir le coeur net, analyser les retours de explain.

La seule subtilité qu’il faut garder à l’esprit est de ne pas laisser un trou dans cette colonne à la suppression. L’astuce la plus simple pour y remédier est de réattribuer le numéro supprimé à l’actuel plus grand numéro, i.e.
delete from table where colonne_numero = X
update table set colonne_numero = X where colonne_numero = (select max(colonne_numero) from table)

Ma plateforme avec 23 jeux de société classiques en 6 langues et 13000 joueurs: http://qcsalon.net/ | Apprenez à faire des sites web accessibles http://www.openweb.eu.org/

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte