2009-03-28 25 views

Respuesta

19

Inserte explícitamente el value-1 en la tabla, luego elimine la fila.

Editar: el siguiente comentario abajo, que discute la edición de la tabla SQLITE_SEQUENCE directa es probablemente preferible: https://stackoverflow.com/a/692871/10093

+8

Supongo que esta es la mejor manera de hacerlo, pero no es bonita. –

+0

Esto no funciona para mí. Si tengo una tabla "Usuarios" con solo 1 entrada (ID 1), mientras que el incremento automático está en 3, entonces se inserta otro usuario con ID -1 luego se elimina, el siguiente usuario insertado sigue siendo id 4 (Extensión del administrador SQLite para firefox , si hace una diferencia) – Assimilater

+1

parece una solución. prefiero abordar el registro de la tabla sqlite_sequence para la tabla en cuestión. –

6

Una forma de hacerlo es insertar la primera fila especificar explícitamente el identificador de fila que desea comenzar con . SQLite luego insertará identificadores de fila que son más altos que el anterior más alto.

76

Desde el SQLite web site:

SQLite no pierde de vista el ROWID más grande que una tabla se ha mantenido siempre el uso de la mesa especial SQLITE_SEQUENCE. La tabla SQLITE_SEQUENCE se crea e inicializa automáticamente cada vez que se crea una tabla normal que contiene una columna AUTOINCREMENT. El contenido de la tabla SQLITE_SEQUENCE se puede modificar mediante las instrucciones ordinarias UPDATE, INSERT y DELETE. Pero hacer modificaciones en esta tabla probablemente perturbe el algoritmo de generación de clave AUTOINCREMENT. Asegúrese de saber lo que está haciendo antes de emprender tales cambios.

yo probamos este, y funciona:

UPDATE SQLITE_SEQUENCE SET seq = <n> WHERE name = '<table>' 

Donde n 1 es la siguiente ROWID que desee y tabla es el nombre de la tabla.

+0

No estoy seguro, ya que no estoy seguro de cómo funciona sqlite internals. Vale la pena señalar que jle y mis sugerencias anteriores son cómo la biblioteca MDB2 de PHP apoya la modificación de la identificación. Eche un vistazo a su fuente de controlador sqlite: http://cvs.php.net/viewvc.cgi/pear/MDB2/MDB2/Driver/sqlite.php?view=markup –

+0

La integridad no es el problema (creo que no un experto o cualquier cosa).El problema que creo que advierten es si elimina una fila con una ID inferior a MAX (ID) y trata de configurar manualmente el incremento automático de esta manera. Se quedará atrapado después de la primera fila insertada debido a una violación de clave principal. – Assimilater

+0

El algoritmo exacto está documentado en la página vinculada y no se modificará en ninguna versión 3.x para preservar la compatibilidad. –

4

En solución con la tabla SQLITE_SEQUENCE, la entrada en esta tabla parece agregarse después de que se agrega la primera inserción en la tabla con la columna de autoincremento. En algunos casos, esto puede causar problemas (es decir, la autoincrementación aún comienza desde 1, no desde el valor deseado).

7

Estoy utilizando la siguiente consulta que resuelve el problema cuando sqlite_sequence no tiene un registro para la tabla (es decir, el primer registro no se ha agregado aún a la tabla), de lo contrario, actualiza la secuencia.

BEGIN TRANSACTION; 

UPDATE sqlite_sequence SET seq = <n> WHERE name = '<table>'; 

INSERT INTO sqlite_sequence (name,seq) SELECT '<table>', <n> WHERE NOT EXISTS 
      (SELECT changes() AS change FROM sqlite_sequence WHERE change <> 0); 
COMMIT; 
+0

Esta es la única solución completamente correcta aquí. Sin embargo, los cambios en el vudú hacen que mis ojos se llenen de lágrimas;) – w00t

1

Ahora he usado esto como mi solución:

REPLACE INTO sqlite_sequence (name, seq) VALUES ('<table>', <n>) 

Este trabajo para mí. Gracias por la respuesta anterior.

Cuestiones relacionadas