Não, você não pode inserir em várias tabelas em um comando MySQL. No entanto, você pode usar transações.
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;
Dê uma olhada em
LAST_INSERT_ID()
para reutilizar valores de incremento automático. Você disse "Depois de todo esse tempo tentando descobrir, ainda não funciona. Não posso simplesmente colocar o ID gerado em um $var e colocar esse $var em todos os comandos do MySQL?" em> "
Deixe-me elaborar:existem 3 maneiras possíveis aqui:
-
No código que você vê acima. Isso faz tudo no MySQL, e oLAST_INSERT_ID()
na segunda instrução será automaticamente o valor da coluna de incremento automático que foi inserida na primeira instrução.
Infelizmente, quando a segunda instrução em si insere linhas em uma tabela com uma coluna de incremento automático, oLAST_INSERT_ID()
será atualizado para o da tabela 2, e não para o da tabela 1. Se você ainda precisar do da tabela 1 depois, teremos que armazená-lo em uma variável. Isso nos leva aos caminhos 2 e 3:
-
Irá estocar oLAST_INSERT_ID()
em uma variável MySQL:
INSERT ... SELECT LAST_INSERT_ID() INTO @mysql_variable_here; INSERT INTO table2 (@mysql_variable_here, ...); INSERT INTO table3 (@mysql_variable_here, ...);
-
Irá estocar oLAST_INSERT_ID()
na variável aphp (ou qualquer linguagem que possa se conectar a um banco de dados, de sua escolha):
INSERIR ...
- Use seu idioma para recuperar o
LAST_INSERT_ID()
, seja executando essa instrução literal no MySQL ou usando, por exemplo,mysql_insert_id()
do php que faz isso por você INSERIR [use sua variável php aqui]
AVISO
Seja qual for a maneira de resolver isso que você escolher, você deve decidir o que deve acontecer caso a execução seja interrompida entre as consultas (por exemplo, seu servidor de banco de dados trava). Se você pode viver com "alguns terminaram, outros não", não continue lendo.
Se, no entanto, você decidir "todas as consultas terminam ou nenhuma termina - eu não quero linhas em algumas tabelas, mas nenhuma linha correspondente em outras, eu sempre quero que minhas tabelas de banco de dados sejam consistentes", você precisa agrupar todas as instruções em uma transação . É por isso que usei o
BEGIN
e COMMIT
aqui.