Pegar valor do auto incremento do mysql no insert

Tenho uma tabela onde os registros estarão em forma de estrutura. Exemplo …

Id - Nome - PaiId
1 - Jose - 1
2 - Maria - 1

O registro do José tem o ID = 1 e como ele não tem um registro pai, o campo Pai ID é igual ao seu ID. No caso da Maria,o ID = 2 e o pai = 1, pois ele é o registro pai.

Como capturar o valor do campo ID, uma vez que ele é auto incremento, para que no insert eu coloque o mesmo valor no campo pai, quando necessário.

Pelo que entendi você quer que o registro tenha ‘id’ e ‘PaiId’ iguais, caso o mesmo não tenha um registro pai, se for este o caso…

1° Como o campo Id é auto_increment você precisa saber qual será o id do próximo registro a ser inserido, para isso faça:

select (max(Id) + 1) from tabela;

O valor retornado será o próximo id e também o PaiId caso o registro não tenho um registro pai

2° Insira o valor retornado no insert

Infelizmente não da para fazer com um comando só, por exemplo:

insert into tabela (id, nome, PaiId)
values ( default, 'Marcos',  (select (max(id) + 1) from tabela));

O MySQL retorna o seguinte erro:
Error Code: 1093. You can’t specify target table ‘tabela’ for update in FROM clause

Eu sugiro definir um valor padrão para o campo PaiId para o caso do registro não ter um registro pai, por exemplo:
Na construção da tabela…

PaiId int default -1

Obrigado por responder, mas não posso usar esse comando de MAX, pois se por um acaso se o ultimo registro for deletado, no MAX será um numero e o auto incremento outro numero.

Você tem razão, mas em uma pesquisa na internet encontrei algo que poderá te ajudar:

O seguinte comando retorna o próximo número do auto_increment da tabela:

select auto_increment from information_schema.tables where table_name = 'nome_da_tabela' and table_schema = 'nome_do_banco';

Então para resolver o seu problema faça:

insert into tabela
(Id, nome, PaiId)
 values
(default, 'Jorge',
(select auto_increment from information_schema.tables where table_name = 'nome_tabela' and table_schema = 'nome_banco'));

Você pode fazer um select assim

SHOW TABLE STATUS LIKE 'nome_da_tabela'
#A informação que você procura está na coluna 11 dessa consulta

Essa consulta retorna as informações da tabela definida após o comando LIKE.
É igual a solução do amigo @gabrielcardoso, só que com muito menos código.:thumbsup:

1 curtida

Boa tarde amigo, blz?

Estou com esse mesmo problema e cheguei nesse tópico, quando dou esse comando ele me trás várias informações junto, tem como eu retornar apenas o valor do Auto_increment?

Desde já agradeço

Em pleno 2020 e essa resposta salvou meu dia. Obrigado!