4 messages in com.mysql.lists.mysql-esRE: clave primaria autoincrementable ...| From | Sent On | Attachments |
|---|---|---|
| Ramon Hernández Cortés | 28 Sep 2005 00:31 | |
| "Juan F. Capristán W." | 28 Sep 2005 01:19 | |
| Ramon Hernández Cortés | 28 Sep 2005 03:05 | |
| "Juan F. Capristán W." | 28 Sep 2005 03:24 |
| Subject: | RE: clave primaria autoincrementable con reseteo![]() |
|---|---|
| From: | Ramon Hernández Cortés (ramo...@wanadoo.es) |
| Date: | 09/28/2005 03:05:39 AM |
| List: | com.mysql.lists.mysql-es |
Muchas gracias, la instrucción exacta para crear la tabla sería: CREATE TABLE tabla_nueva(valor int auto_increment,PRIMARY KEY (valor));
y para resetear el contador primero tendría que borrar todos las inserciones, si no las he borrado anteriormente y realizar un alter table en una transacción, porque sinó hay peligro de que halla una insercion no deseada y el reseteo no se realize. (transacción) DELETE FROM tabla_nueva; ALTER TABLE tabla_nueva AUTO_INCREMENT = 1; (fin transacción) Hasta aqui, ok!
En que lenguage utilizas last_insert_id()?Yo utilizo c# para atacar la BD. Como minimo tendria que ser una intrucción que funcionara en la consola de MySql.
He intentado buscar esta instrucción en el manual de MySql y no lo he encontrado.
Habria alguna manera de saver el numero que se ha incrementado sin tener que realizar despues de la inserción la siguiente select? (transacción) INSERT INTO tabla_nueva values(null); SELECT MAX(valor) FROM tabla_nueva; (fin transacción)
Si no lo hago con inserciones (autoincremento) y lo hago con updates (valor=valor+1), tengo que hacer un select y un update. 2 instrucciones. Igual que lo descrito anteriormente. supongo que el tiempo de un insert es menor que un update.
Muchas gracias por todo.
Ramon
-----Mensaje original----- De: "Juan F. Capristán W." [mailto:ju...@editmaker.com] Enviado el: dimecres, 28 / setembre / 2005 10:20 Para: mysq...@lists.mysql.com; Ramon Hernández Cortés Asunto: Re: clave primaria autoincrementable con reseteo
Hola, no sé si he entendido bien el problema : Necesitas hacer el tipo de inserciones descrito, pero no te vale con calcular el máximo porque no quieres que se inserten valores que se hayan borrado previamente. Creo que en ese caso lo único que puedes hacer es guardar en "algún sitio" (por ejemplo otra tabla) el último id insertado a partir del que puedas construir el siguiente. En caso de hacerlo con una tabla extra, sería algo muy sencillo: 1º : La tabla nueva sólo deberá contener ese campo (en principio), y dicho campo deberá ser auto incremental. Sería algo así CREATE TABLE tabla_nueva(valor int auto_increment); INSERT INTO tabla_nueva values(null); 2º : Cada vez que vas a hacer una inserción en tu otra tabla, hacerlo primero en la nueva, y luego calcular el id, algo así: insert into tabla_nueva values(null); insert into otra_tabla values((year(now() + "/" + last_insert_id()), ...); 3º : Al hacer un borrado, convendría que también borraras de tabla_nueva, para no ir acumulando demasiados números tontamente.
La inserción en vez de un update del tipo valor=valor+1 la hago para poder luego utilizar la función last_insert_id(), que te devuelve precisamente el valor del último elemento auto incrementable insertado en esa sesión. Por otro lado, tendrías que trabajar un poco más en la expresión "(year(now() + "/" + last_insert_id())", ya que por lo que veo, tu número tiene que tener la fecha sólo con dos caracteres, y el número con ceros por delante, por lo que tendrás que utilizar funciones del tipo "date_format" y "format_number" para conseguir el formato que deseas.
Espero haberte ayudado. Un saludo, Juan.
At 09:31 28/09/2005, you wrote:
Hola
tengo una tabla con una clave primaria (id) varchar (10) que ha de tener forzosamente esta estructura 05/0000001 05/0000002 .........
Cuando inicie el año 2006 ha de reiniciarse con 06/0000001 06/0000002
Esta tabla se podrá actualizar desde diferentes maquinas.
Yo había pensado calcular la calve primaria cada vez que quisiera hacer una inserción. La frecuencia de inserciones es relativamente baja. Es decir Realizar una consulta buscando el max(id) y hacer un calculo para el incremento.... a no ser que sea un nuevo año que reinicio el id
El problema está en que los registros que inserto también los borro y no quiero hacer inserciones con id que anteriormente ya hubieran existido. Si lo hago como lo había pensado inicialmente podría generar id's que ya hubieran existido. es decir
ERROR: insert 05/0000001 insert 05/0000002 delete 05/0000002 insert 05/0000002 delete 05/0000001 insert 05/0000003 delete 05/0000003 insert 05/0000004
CORRECTO: (deseado) insert 05/0000001 insert 05/0000002 delete 05/0000002 insert 05/0000003 delete 05/0000001 insert 05/0000004 delete 05/0000004 insert 05/0000005
En principio la tabla al final del año ha de quedar casi vacía , es decir que se habrán borrado casi todos los registros que se habrán insertado
Alguien tiene una idea?
Una solución es tener una tabla extra que tuviera un valor que se auto incrementará, pero no se si esta es una buena solución y tampoco como contruirla y resetear el valor cuando contenga. O incrementar yo un valor de una tabla.... Esto me parece una chapuza perooo esque no se como montarlo.
Alguien ha hecho algo parecido
Muchas Gracias
Ramon
-- No se encontr_ ning_n virus en este mensaje saliente. Checked by AVG Anti-Virus. Version: 7.0.344 / Virus Database: 267.11.8/113 - Release Date: 27/09/2005
-- Lista de Correos de MySQL Para el historial de la lista: http://lists.mysql.com/mysql-es Para cancelar inscripción: http://lists.mysql.com/mysql-es?unsub=ramo...@wanadoo.es




