Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL Inserir em várias tabelas? (Normalização do banco de dados?)


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:

  1. 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, o LAST_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:

  2. Irá estocar o LAST_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, ...);
    

  3. Irá estocar o LAST_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.