• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

gimbras

PHP MySQL Auto-increment

13 mensagens neste tópico

Alguem me ajuda?

Com php e mysql, faço delete a uma row, mas o campo que tenho em auto_incremented não actualiza, caso faça delete a uma row que não seja a ultima de todas.

Acrescentei uma linha de update, que parece resolver em parte, que é:

mysql_query("UPDATE TABELA SET id=(id-1) WHERE id>$current_row");

O problema é que há id's que estão após os espaços em branco apagados. Alguma ideia para um script que faça check aos campos que não tenham id sequencial ao anterior?

Quero que a BD use os IDs dos registos apagados evitando assim que existam registos descontinuos.

Eu apago cenas na BD que não são as últimas e queria que a BD não "esquecesse" os ids apagados e que na próxima vez que fosse criado um novo id usasse um id apagado anteriormente.

Alguém como fazer?

Cumps.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se queres assim nao podes usar o autoincrement.

O autoincrement existe para te facilitar a vida e não funciona como estás a dizer.

Por que razão queres que os IDs sejam numericamente sequenciais?

A funcoes do mysqlk que o php tem quase todas têm um ponteiro que percorre linha a linha. não estou a ver que vantagen terá um id numeriacamente seguido...

expoe o problema a um nivel mais generico, pode ser que  se arranje outra solucao que nao te estejas a lembrar

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bom isto não é para mim. Mas eu tmb não curto ir à BD e vê-la numerada assim 1, 2, 45, 46, 49

Com "buracos" entre os IDs que podiam ser mto bem usados. Tmb já me disseram que isso acontece devido ao autoincrement.

Vou perguntar à pessoa que me colocou esta dúvida o que pretende.

Quem me pediu isto diz que estava a pensar em usar um foreach para detectar os vazios, através da array criada com a variável numa query de select ($query = mysql_query("SELECT * bla bla bla") , mas isso dá um belo trabalho, e este é um processo que muito mais pessoas devem pretender, por isso calculo que exista algo mais prático.

Obg.

PS: Já agora no phpMyAdmin consegues reordenar sequencialmente os registos se eles estiverem misturados? ou seja existem todos os números mas por exemplo o 122 aparece a seguir ao 1. É clicar nessa setinha ou nem por isso?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

PS: Já agora no phpMyAdmin consegues reordenar sequencialmente os registos se eles estiverem misturados? ou seja existem todos os números mas por exemplo o 122 aparece a seguir ao 1. É clicar nessa setinha ou nem por isso?

Isso não tem nada a haver com o phpmyadmin ou qq qq outro bdadmin... só está relacionado com o motor de bases de dados (mysql no teu caso).

usa o "order by ID".

exemplo:

select * from table group by ID;

nesse caso o resultado sairte-á ordenado por id.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obg pela dica é que aquilo já estava tudo desarrumado.

Olha aqui fica a explicação da necessidade de reciclar os tais registos apagados:

"É assim, preciso para um backoffice dum site duma banda, em que eles acrescentam noticias, modificam, eliminam, etc... ao eliminar queria que actualizasse a lista, para poder mostrar melhor as ultimas noticias... ja ta quase tudo a funcionar, excepto esse detalhe..."

Se puderes ajudar avisa, obg.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

yaps... posso ajudar.

A base de dados é mais facil de usar do que tu a está a pensar.

O ID só serve para teres uma referencia unica, não tem qualquer outro significado.

As coisas nao ficam desorganizadas na base de dados. As coisas ficam lá guardadas e indexadas, a organização es tu que a fazes quando fazes um pedido. Para isso é que uma base de dados serve.

Para ires buscar as ultimas cinco noticias por exemplo fazes

SELECT * FROM noticias ORDER BY ID desc LIMIT 5;

Na verdade isto pode não ser 100% eficaz pois apesar de o ID ser autoincrement não tens nenhuma restrição que te garanta que o o ID maior corresponde a ulima noticia. Imagina que tens um backoffice de edicao de noticias existentes e usas um DELETE e um INSERT em vez de um update... já ias entornar o caldo.

A meu conselho é: vai buscar os 5 ids maiores e caga nisso... eu normalmente faço assim e funciona bem.

Se quiseres fazer isso como mandam os livros tb n é complicado.

1.Crias um campo chamado por exemplo DATA_E_HORA do tipo TIMESTAMP. (Um timestamp é um segundo no tempo e é incrivelemnte facil de usar)

2.Qdo fores fazer um insert não definas o campo DATA_E_HORA, pois o mysql, se esse campo for nulo, poe lá o valor da data/hora actual. Assim tens sempre a hora em que a noticia foi inserida.

3. Bem... isto é tao simples que mal deu para contar até três :thumbsup: anyway... neste caso o pedido era:

SELECT * FROM noticias ORDER BY DATA_E_HORA desc LIMIT 5;

Surpreendido? facil demais não é? :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Também tinha encontrado o mesmo problema mas resolvi com o comando que o pedrotuga disse: SELECT * FROM noticias ORDER BY ID desc LIMIT 5;

Gimbras, se quiseres continuar a usar o autoincrement, o que podes fazer é ir de vez enquanto aceder ah base de dados e alterares o ID e depois actualizares o autoincrement para o teu ultimo id, assim ficam novamente ordenados... ou entao se quiseres algo diferente... uma função que te actualiza isso. programar algo do género penso que seja simples...

Se puder ajudar, dispoem  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Também tinha encontrado o mesmo problema mas resolvi com o comando que o pedrotuga disse: SELECT * FROM noticias ORDER BY ID desc LIMIT 5;

Gimbras, se quiseres continuar a usar o autoincrement, o que podes fazer é ir de vez enquanto aceder ah base de dados e alterares o ID e depois actualizares o autoincrement para o teu ultimo id, assim ficam novamente ordenados... ou entao se quiseres algo diferente... uma função que te actualiza isso. programar algo do género penso que seja simples...

Se puder ajudar, dispoem  ;)

bruno, vais ver com o tempo que ter IDs todos seguidinhos nao serve par nada. O autoincrement é bom porque garante que a chave fica unica.

eu antes tabem fazia coisas do estilo... ir lá mudar à mao e tal... mas o motor de bases de dados é que tem que trbalhar para nós... não o contrário.

Usa o ID só para referência unívoca e vais ver que o valor dele só serve mesmo apra isso, uma referencia... se quiseres ter tudo ordenado por inserção usa o timestamp... vais ver queé mais simples do que tinhas pensado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, acho que vou passar a dizer a necessidade de ter o auto_increment.

Imaginem que têm uma tabela que vos guarda os utilizadores de acesso a um forum.

e ao colocar na tabela ficam assim:

1 pppp

2 oooo

3 gggg

se apagarem o ooo (2) a tabela fica so com

1 pppp

3 gggg

para apagarem podem fazer uma query com id = 2;

se mudarem os id's todos apos a eliminação o utiilizador 3 já vai ser o 2.

imaginem que os posts do forum ficam apenas com o registo do id do utilizador para saber quem fez o post.

Se apagarem e mudarem os id's todos isso vai gerar uma desorganização terrivel.

O mesmo acontece com as noticias.

É muito mais correcto e facil fazer uma query com id da noticia do que com o nome de cabeçalho da noticia.

Cumps,

espero ter ajudado,

Pedantilva

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

entao vês.. mais uma razao para nao andar a alterar registos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

entendi perfeitamente.. especialmente com o exemplo do fórum...  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Yah mas esse exemplo do fórum, eu elimino users dos meus à mão.

Só que não elimino users que postem senão tinha de ir às tabelas dos posts alterar o ID do poster.

O que eu faço é eliminar users que não completaram a inscrição e depois pego no IDs caso não sejam os últimos e dou esse ID a alguém que se tenha acabado de inscrever.

Por enquanto ainda dá para controlar mas confesso que é mais mania minha da perfeição que necessidade imperativa.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora