sql >> Base de Datos >  >> RDS >> Mysql

MySQL Insertar en varias tablas? (¿Normalización de la base de datos?)

No, no puede insertar en varias tablas en un comando MySQL. Sin embargo, puede usar transacciones.

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;

Eche un vistazo a LAST_INSERT_ID() para reutilizar los valores de incremento automático.

Dijiste "Después de todo este tiempo tratando de resolverlo, todavía no funciona. ¿No puedo simplemente poner la ID recién generada en una $var y poner esa $var en todos los comandos de MySQL? "

Permítanme elaborar:hay 3 formas posibles aquí:

  1. En el código que ves arriba. Esto lo hace todo en MySQL, y el LAST_INSERT_ID() en la segunda declaración será automáticamente el valor de la columna de incremento automático que se insertó en la primera declaración.

    Desafortunadamente, cuando la segunda declaración inserta filas en una tabla con una columna de incremento automático, el LAST_INSERT_ID() se actualizará a la de la tabla 2, y no a la de 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 vías 2 y 3:

  2. Almacenará el LAST_INSERT_ID() en una variable MySQL:

    INSERT ...
    SELECT LAST_INSERT_ID() INTO @mysql_variable_here;
    INSERT INTO table2 (@mysql_variable_here, ...);
    INSERT INTO table3 (@mysql_variable_here, ...);
    
  3. 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 ...
    • Utilice su idioma para recuperar el LAST_INSERT_ID() , ya sea ejecutando esa declaración literal en MySQL o usando, por ejemplo, mysql_insert_id() de php que hace eso por ti
    • INSERT [use your php variable here]

ADVERTENCIA

Cualquiera que 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 falla). Si puedes vivir con "algunos han terminado, otros no", no sigas leyendo.

Sin embargo, si decide "todas las consultas finalizan o ninguna finaliza; no quiero filas en algunas tablas pero no filas coincidentes en otras, siempre quiero que las tablas de mi base de datos sean consistentes", debe envolver todas las declaraciones en una transacción . Es por eso que usé el BEGIN y COMMIT aquí.