Tentei pesquisar uma maneira de insert
obter informações em várias tabelas na mesma consulta, mas descobri que é impossível? Então, eu quero insert
isso simplesmente usando várias consultas, ou seja;
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')
Mas como posso dar o incremento automático id
do users
para o "manual" userid
da profile
tabela?
Respostas:
Não, você não pode inserir em várias tabelas em um comando MySQL. No entanto, você pode usar transações.
Dê uma olhada
LAST_INSERT_ID()
para reutilizar valores de incremento automático.Edit: você disse " Depois de todo esse tempo tentando descobrir, ele ainda não funciona. Não posso simplesmente colocar o ID apenas gerado em um $ var e colocar esse $ var em todos os comandos do MySQL? "
Deixe-me elaborar: existem três maneiras possíveis aqui:
No código que você vê acima. Isso faz tudo no MySQL, e a
LAST_INSERT_ID()
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 inserir linhas em uma tabela com uma coluna de incremento automático,
LAST_INSERT_ID()
ela será atualizada para a tabela 2, e não para a tabela 1. Se você ainda precisar da tabela 1 posteriormente, teremos que armazená-la em uma variável Isso nos leva às maneiras 2 e 3:Estocará a
LAST_INSERT_ID()
variável MySQL:Vai estocar o
LAST_INSERT_ID()
em uma variável php (ou qualquer linguagem que pode se conectar a um banco de dados, de sua escolha):INSERT ...
LAST_INSERT_ID()
, executando a instrução literal no MySQL ou usando, por exemplo, php'smysql_insert_id()
que fazem isso por vocêINSERT [use your php variable here]
AVISO
Qualquer que seja a maneira de resolver isso, 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, sempre quero que minhas tabelas de banco de dados sejam consistentes", você precisa agrupar todas as instruções em uma transação. Por isso usei o
BEGIN
eCOMMIT
aqui.Comente novamente se precisar de mais informações :)
fonte
@mysql_variables
em conjunto com as preparadas?bastante simples se você usar procedimentos armazenados:
script completo:
fonte
O que aconteceria se você quisesse criar muitos desses registros (para registrar 10 usuários, não apenas um)? Eu encontro a seguinte solução (apenas 5 consultas):
Etapa I: Crie uma tabela temporária para armazenar novos dados.
Em seguida, preencha esta tabela com valores.
Aqui, em vez de
$ALL_VAL
colocar uma lista de valores: ('test1', 'test1', 'bio1', 'home1'), ..., ('testn', 'testn', 'bion', 'homen')Etapa II: envie dados para a tabela 'usuário'.
Aqui, "IGNORE" pode ser usado, se você permitir que alguns usuários já estejam dentro. Opcionalmente, você pode usar UPDATE semelhante à etapa III, antes desta etapa, para descobrir quem os usuários já estão dentro (e marcá-los na tabela tmp). Aqui supomos que esse nome de usuário é declarado como
PRIMARY
na tabela de usuários.Etapa III: aplique a atualização para ler todos os IDs de usuários da tabela tmp. ESTE É UM PASSO ESSENCIAL.
Etapa IV: criar outra tabela, usando o ID de leitura para usuários
fonte
tente isso
Referências
PHP
MYSQL
fonte
veja mysql_insert_id ()
aqui a documentação: http://in.php.net/manual/en/function.mysql-insert-id.php
fonte
LAST_INSERT_ID()
o programador?Esta é a maneira que eu fiz isso para um projeto uni, funciona bem, provavelmente não é seguro
}
fonte
Apenas um comentário sobre o seu ditado
Você come todos os seus pratos de almoço misturados com bebidas na mesma tigela?
Eu suponho - não.
O mesmo aqui.
Há coisas que fazemos separadamente.
2 consultas de inserção são 2 consultas de inserção. Está tudo bem. Nada de errado com isso. Não há necessidade de amassá-lo em um.
Mesmo para selecionar. A consulta deve ser sensata e fazer seu trabalho. Essa é a única razão. O número de consultas não é.
Quanto às transações - você pode usá-las, mas isso não é grande coisa para o site médio. Se acontecer uma vez por ano (se houver) que um registro de usuário está sendo quebrado, você poderá corrigir, sem dúvida.
existem centenas de milhares de sites executando o mysql sem nenhum driver de suporte a transações. Você já ouviu falar de desastres terríveis desmembrando esses sites? Nem eu.
E mysql_insert_id () tem a ver com transações. você pode incluir a transação corretamente. são apenas assuntos diferentes. Alguém levantou essa questão do nada.
fonte
That function is the devil of database consistency.
que fez isso, não transações. Não vejo nada de ruim nas transações.Para DOP Você pode fazer isso
fonte