2012-07-19 8 views
6

No soy totalmente nuevo en SQL, pero estoy oxidado y tengo problemas con MYSQL (usando PhPMyAdmin) ... miré esto: MySQL insert to multiple tables (relational) y algunos otros temas relacionados, pero no han encontrado una respuesta. Estoy simplificando mi ejemplo para transmitir el mensaje.inserto SQL relacional a 2 tablas en una sola consulta sin recurrir a mysql_insert_id()

Si tiene dos tablas:

'table1' has: id (primary key, auto-increment), description (text) 
'table2' has: id (primary key, auto-increment), title (text), description_id (int) 

¿Cómo se crea una instrucción INSERT de la chamusquina de manera que description_id está almacenando el valor de table1.id?

Sé que hay maneras php que hacer 2 consultas, pero me gustaría hacerlo todo en SQL, tiene que haber una manera? ¿Debo configurar mis tablas de manera diferente? I read something about foreign keys y no tengo idea si eso es aplicable.

Gracias!

+1

instrucciones INSERT sólo pueden afectar a una mesa. – thatidiotguy

+1

http://stackoverflow.com/questions/5178697/mysql-insert-into-multiple-tables-database-normalization – hackattack

+0

Me encuentro con algo prometedor en los documentos de mysql: 'INSERT INTO foo (auto, texto) VALORES (NULL, 'texto'); # Generar ID insertando NULL INSERT INTO foo2 (id, texto) VALORES (LAST_INSERT_ID(), 'texto'); # ID uso en la segunda table' – tim

Respuesta

5

gracias a @hackattack, que encontraron esto? answered already elsewhere.

BEGIN 
INSERT INTO users (username, password) 
    VALUES('test', 'test') 
INSERT INTO profiles (userid, bio, homepage) 
    VALUES(LAST_INSERT_ID(),'Hello world!', 'http://www.stackoverflow.com'); 
COMMIT; 

pero, por desgracia - que no funcionó. La referencia de MySQL 5 muestra que la sintaxis ligeramente diferente:

INSERT INTO `table2` (`description`) 
    VALUES('sdfsdf');# 1 row affected. 
INSERT INTO `table1`(`table1_id`,`title`) 
    VALUES(LAST_INSERT_ID(),'hello world'); 

Y, he/he aquí - que funciona!

Más problemas en el futuro Aunque la consulta tendrá éxito en phpMyAdmin, mi instalación de PHP se queja de la consulta y genera un error de sintaxis. Recurrí a hacer esto el php-camino haciendo de 2 consultas separadas y el uso de mysql_insert_id()

Me parece que molesto, pero supongo que eso no es mucho menor que la carga del servidor en una transacción.

+0

Exactamente lo que [propuse] (http: // stackoverflow.com/a/11568744/215042) (Gracias por votar o aceptar una respuesta ...). Estrictamente hablando, esto sigue siendo 2 consultas. Es solo que están siendo ejecutados como una sola acción atómica. – RobIII

+0

@roblll aha, aprendí algo nuevo de tu comentario: una acción atómica ... bueno, al final del día, se trata de la eficiencia y la carga del servidor, etc. ... así que lo que sea que lo haga más y más rápido, eso es lo que estaba buscando. – tim

+0

@RobIII y ¿En qué se diferencia esto de mi alternativa sugerida en PHP? – hjpotter92

1

No se puede insertar en más de una tabla (grabables vistas a un lado *, pero que yo sepa MySQL no soporta ellos) con una instrucción de inserción.

Lo podría ser de interés para usted es transactions que permite a las declaraciones 'grupo' en una sola acción "atomic".

* Lo cual, de hecho, sólo permitiría actualizaciones, inserciones (no creo, pero ahora estoy empezando a dudar de ella ... de todos modos, no es la cuestión aquí de todos modos)

-1

Probablemente necesites usar Triggers aquí para que cada vez que table2 obtenga una operación de inserción, se ejecute un disparador para hacer una inserción en table1.

+0

Y cómo proporcionar los valores de los campos de la segunda tabla a este disparador? – RobIII

Cuestiones relacionadas