A lo mejor esto te puede ayudar.
Tengo 2 tablas (como ejemplo):
mysql> DESCRIBE example;
+--------+----------+------+-----+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | Extra |
+--------+----------+------+-----+---------+-------+
| nombre | CHAR(20) | YES | | NULL | |
| fecha | DATE | YES | | NULL | |
+--------+----------+------+-----+---------+-------+
2 ROWS IN SET (0.00 sec)
mysql> DESCRIBE ejemplo;
+--------+----------+------+-----+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | Extra |
+--------+----------+------+-----+---------+-------+
| nombre | CHAR(20) | YES | | NULL | |
| fecha | DATE | YES | | NULL | |
+--------+----------+------+-----+---------+-------+
2 ROWS IN SET (0.02 sec)
Una tiene registros, la otra esta vacia:
mysql> SELECT * FROM ejemplo;
+--------+------------+
| nombre | fecha |
+--------+------------+
| coco | 0000-00-00 |
| Maria | 2010-11-23 |
| Juan | 2005-05-23 |
| Carlos | 2004-05-25 |
| Ana | 2010-11-23 |
+--------+------------+
5 ROWS IN SET (0.00 sec)
mysql> SELECT * FROM example;
Empty SET (0.00 sec)
Asi que, como quiero obtener todos los 'nombres' de la tabla ejemplo he introducirlos en la tabla example
no puedo hacer lo que sugeriste al inicio de este post, porque:
1 - Una consulta INSERT unica en la linea de comando, solo sirve para insertar 1 sola fila dentro de una tabla
No es un bucle, no es un loop, es una sola fila dentro de la tabla.
2 - Al utilizar un subquery como hiciste, dentro del unico INSERT en linea de comando, caemos en el mismo problema
dicho subquery te retorna mas de 1 registro (SELECT * FROM... retorna varios registros no uno solo) sin embargo
tu consulta INSERT solo inserta 1 fila de una sola vez.
ENtonces que haces, si tu tienes que captar varios registros y ingresarlo en una tabla pero con una simple consulta
SQL INSERT en linea de comandos no puedes? pues te ayudas en este caso de un procedimiento almacenado, como bien dijiste
dicho procedimiento tiene que tener CURSORES y un bucle repetitivo que vaya captando indice por indice cada registro
y lo vaya insertando en la tabla deseada... entonces, (no soy buena con el limitante PL/SQL de MySQL) pero aqui vamos,
esto te puede servir de ejemplo:
mysql> delimiter /
mysql> CREATE PROCEDURE proceso()
BEGIN
DECLARE hecho INT DEFAULT 0;
DECLARE a CHAR(20);
DECLARE cursor1 cursor FOR SELECT nombre FROM primaria.ejemplo;
DECLARE continue handler FOR sqlstate '02000' SET hecho = 1;
OPEN cursor1;
repeat
fetch cursor1 INTO a;
IF NOT hecho THEN
INSERT INTO example VALUES(a, '2010-11-23');
END IF;
until hecho END repeat;
close cursor1;
END;
/
mysql> delimiter ;
Hecho el procedimiento anterior.. lo llamas:
mysql> CALL proceso();
Query OK, 1 ROW affected (0.01 sec)
mysql> SELECT * FROM example;
+--------+------------+
| nombre | fecha |
+--------+------------+
| coco | 2010-11-23 |
| Maria | 2010-11-23 |
| Juan | 2010-11-23 |
| Carlos | 2010-11-23 |
| Ana | 2010-11-23 |
+--------+------------+
5 ROWS IN SET (0.00 sec)
Salu2.