Intenté buscar una forma de insert
información en varias tablas en la misma consulta, pero descubrí que es imposible. Entonces lo quiero insert
simplemente usando múltiples consultas, es decir;
INSERT INTO users (username, password) VALUES('test', 'test')
INSERT INTO profiles (userid, bio, homepage) VALUES('[id of the user here?]','Hello world!', 'http://www.stackoverflow.com')
Pero ¿cómo puedo dar el incremento automático id
de la users
al "manual" userid
para la profile
mesa?
Respuestas:
No, no puede insertar en varias tablas en un comando MySQL. Sin embargo, puede usar transacciones.
Eche un vistazo
LAST_INSERT_ID()
para reutilizar los valores de aumento automático.Editar: usted dijo " Después de todo este tiempo tratando de resolverlo, todavía no funciona. ¿No puedo simplemente poner la ID recién generada en $ var y poner ese $ var en todos los comandos de MySQL? "
Permítanme explicarlo: hay 3 formas posibles aquí:
En el código que ves arriba. Esto lo hace todo en MySQL, y el
LAST_INSERT_ID()
en la segunda instrucción será automáticamente el valor de la columna de autoincremento que se insertó en la primera instrucción.Desafortunadamente, cuando la segunda instrucción inserta filas en una tabla con una columna de incremento automático,
LAST_INSERT_ID()
se actualizará a la de la tabla 2 y no a la tabla 1. Si aún necesita la de la tabla 1 después, tendremos que almacenarla en una variable Esto nos lleva a las formas 2 y 3:Almacenará el
LAST_INSERT_ID()
en una variable MySQL:Almacenará el
LAST_INSERT_ID()
en una variable php (o cualquier idioma que pueda conectarse a una base de datos, de su elección):INSERT ...
LAST_INSERT_ID()
, ya sea ejecutando esa declaración literal en MySQL, o usando, por ejemplo, php'smysql_insert_id()
que lo hace por ustedINSERT [use your php variable here]
ADVERTENCIA
Cualquiera sea la forma de resolver esto que elija, debe decidir qué debe suceder si la ejecución se interrumpe entre consultas (por ejemplo, su servidor de base de datos se bloquea). Si puede vivir con "algunos han terminado, otros no", no siga leyendo.
Sin embargo, si decide que "todas las consultas finalizan o ninguna finaliza; no quiero filas en algunas tablas pero no hay filas coincidentes en otras, siempre quiero que las tablas de mi base de datos sean consistentes", debe ajustar todas las declaraciones en una transacción. Por eso usé el
BEGIN
yCOMMIT
aquí.Comenta nuevamente si necesitas más información :)
fuente
@mysql_variables
junto con las declaraciones preparadas?bastante simple si usa procedimientos almacenados:
guión completo:
fuente
¿Qué pasaría si desea crear muchos de esos registros (para registrar 10 usuarios, no solo uno)? Encuentro la siguiente solución (solo 5 consultas):
Paso I: crear una tabla temporal para almacenar nuevos datos.
Luego, llene esta tabla con valores.
Aquí, en lugar de
$ALL_VAL
colocar una lista de valores: ('test1', 'test1', 'bio1', 'home1'), ..., ('testn', 'testn', 'bion', 'homen')Paso II: Enviar datos a la tabla 'usuario'.
Aquí, "IGNORE" puede usarse, si permite que algunos usuarios ya estén dentro. Opcionalmente, puede usar ACTUALIZACIÓN similar al paso III, antes de este paso, para encontrar a los usuarios que ya están dentro (y marcarlos en la tabla tmp). Aquí suponemos que ese nombre de usuario se declara como
PRIMARY
en la tabla de usuarios.Paso III: aplique la actualización para leer todas las identificaciones de los usuarios de la tabla tmp. ESTE ES UN PASO ESENCIAL.
Paso IV: Cree otra tabla, usando la identificación de lectura para los usuarios
fuente
prueba esto
Referencias
PHP
MYSQL
fuente
echar un vistazo a mysql_insert_id ()
aquí la documentación: http://in.php.net/manual/en/function.mysql-insert-id.php
fuente
LAST_INSERT_ID()
al programador.Esta es la forma en que lo hice para un proyecto uni, funciona bien, probablemente no sea seguro
}
fuente
Solo un comentario sobre tu dicho
¿Come todos sus platos de almuerzo mezclados con bebidas en el mismo tazón?
Supongo que no.
Igual que aquí.
Hay cosas que hacemos por separado.
2 consultas de inserción son 2 consultas de inserción. Todo está bien. No tiene nada de malo. No es necesario mezclarlo en uno.
Lo mismo para seleccionar. La consulta debe ser sensata y hacer su trabajo. Esa es la única razón. Número de consultas no lo es.
En cuanto a las transacciones, puede usarlas, pero no es TAN importante para el sitio web promedio. Si sucedió una vez al año (si alguna vez) que se rompe el registro de un usuario, podrá solucionarlo, sin duda.
Hay cientos de miles de sitios que ejecutan MySQL sin controlador de soporte de transacciones. ¿Has oído hablar de desastres terribles que rompen estos sitios? Yo tampoco.
Y mysql_insert_id () tiene que ver con las transacciones. Puede incluir en la transacción todo bien. Es solo asuntos diferentes. Alguien planteó esta pregunta de la nada.
fuente
That function is the devil of database consistency.
que hizo eso, no las transacciones. No veo nada malo en las transacciones.Para PDO puede hacer esto
fuente