Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   Key Violation en tabla sin claves primarias (https://www.clubdelphi.com/foros/showthread.php?t=18188)

mak8888 04-02-2005 11:50:23

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.

Coco 04-02-2005 13:07:57

Probastes con hacerle un pack a la tabla?

mak8888 04-02-2005 14:27:54

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.

Coco 04-02-2005 14:57:00

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

marcoszorrilla 04-02-2005 15:23:03

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,

Sick boy 27-02-2005 11:38:13

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;

Evidentemente, aseguraros de que el valor que pasais en Value es el mayor, u os encontrareis de nuevo con el mismo problema.

Saludos.

PD: Saludos tambien a marcos desde la tierruca, pasando un frio de cagarse.

marcoszorrilla 27-02-2005 11:48:12

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.


La franja horaria es GMT +2. Ahora son las 12:06:53.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi