FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Key Violation en tabla sin claves primarias
Os explico. Llevo bastante tiempo utilizando una base de datos. Es muy simple. Tiene una campo Code de Tipo Autoincremental y Key *. El resto de campos son normales (strings) de distinto tamaño. No tienen enlaces con ninguna otra tabla, ni en la tabla hay declarada clave primaria alguna. Es decir, es una tabla de lo más simple.
Desde hace un par de días vengo teniendo errores que no consigo explicar. Al hacer un insert meto relleno todos los datos tal y como siempre venía haciendo (no he modificado el código), pero ahora en el table.post da "Key Violation". Ya no sé que probar. En el Database Desktop pasa lo mismo si lo meto a mano. Key Violation. He vuelto a revisar por si hubiese metido alguna clave primaria (aunque sabia de antemano que no) y efectivamente todo sigue igual. No sé que puede pasar. Alguna idea? Todo lo que he leido sobre este error es en torno a claves primarias, así que no entiendo nada. Lo mismo pasa si intento hacer un insert por SQL con 1 TQuery claro está.... Estoy desesperado. Se aceptan sugerencias. Gracias a todos. |
#2
|
|||
|
|||
Probastes con hacerle un pack a la tabla?
|
#3
|
|||
|
|||
Hola Coco. La verdad es que no sé que es un pack, pero despues de trastear con la DB me dí cuenta que por algún motivo, se ha corrompido. He recuperado la copia de seguridad, a´si que solo he perdido el trabajo de 3 dias podia haber sido peor, la verdad.
Muchas gracias por todo. |
#4
|
|||
|
|||
Lo que hace el pack exactamente es tratar de recuperar una tabla cuando esta corrupta. Esta funcion la provee el database desktop cuando entras a diseño de la estructura de una tabla, tienes un check para hacer pack a la tabla pones guardar los cambios y solucionado el problema. Tambien existen una librerias que te permiten hacer esto por codigo desde tu aplicacion simplemente instalando unas dlls.
Saludos |
#5
|
||||
|
||||
Veo que al final lo has resuelto, primero acalarar que Pack lo que hace es eliminar definitivamente los registros que hayan sido borrados, ya que estos como el Dbase permanecen el la tabla aunque no se ven.
A mi me ha ocurrido alguna vez esto, la conclusión es que a veces por un fallo a pesar de la que un campo es clave única se repite, y entonces está dando errores de Key violation, en todo momento. Recuerdo haberlo resuelto con una copia de la misma tabla vacía, con índices, y luego con el DatabaseDesktop le he añadido los registros de la que está dañada, de esta manera el que está dando el error no pasa y se soluciona. Un Saludo,
__________________
Guía de Estilo de los Foros Cita:
|
#6
|
|||
|
|||
Hola,
Lo que se rompio en tu tabla es el autoincremental. Por algun motivo, volvio hacia atras, o dejo de crecer, por eso te da el error de key violation, porque se repite la clave primaria Lo que dice marcos es correcto (alguien lo dudaba), y se soluciona porque desde una base de datos vacia el autoincremental esta correcto. Por fin voy a poder agregar algo nuevo. La base de datos se puede arreglar sin tener que pasar todos los registros a una nueva. Usar el siguiente codigo, pasandole el nombre de la base de datos y el nuevo valor del autoincremental: Código:
Procedure SetAutoInc(filename : string; Value : Longint); var mystream : tfilestream; begin mystream := tfilestream.create(filename, fmOpenWrite + fmShareExclusive); try mystream.Seek(73, soFromBeginning); mystream.Writebuffer(Value, SizeOf(Value)); finally mystream.Free; end; end; Saludos. PD: Saludos tambien a marcos desde la tierruca, pasando un frio de cagarse. |
#7
|
||||
|
||||
Pues también me ha ocurrido el caso del autoincrimento, ojo que también es un problema y gordo pues nos da error pero también nos elimina los registros.
Si el problema es de autoincremento, y creamos una tabla nueva y le pasamos los registros de la dañada, como la nueva parte de 0 al insertarle los registros el autoincremento supongamos que se pone en el número 5000, llegará un momento en que el autoincremento llegue a coincidir por el número que llevabamos en la otra tabla y entonces al agregar registros nuevos, nos eliminará uno de los antiguos y además nos enviará un error de Key violation, yo utilizo la función que se cita para poner el autoincremento de la tabla a 0 antes de añadirle los registros. Devuelvo el saludo, pues ahora estoy de nuevo en mi tierra, pues he estado desde el jueves en Madrid por mor de una reunión.
__________________
Guía de Estilo de los Foros Cita:
|
|
|
|