2011-10-26 27 views
72

Estoy intentando crear una tabla con una clave primaria de incremento automático en Sqlite3. No estoy seguro de si esto es realmente posible, pero espero que solo tenga que designar los otros campos. Por ejemplo:¿Hay un incremento automático en sqlite?

CREATE TABLE people (id integer primary key auto increment, first_name varchar(20), last_name varchar(20)); 

Entonces, cuando agrego un valor, esperaba sólo para tener que hacer:

INSERT INTO people 
VALUES ("John", "Smith"); 

Es esto posible?

Me postulo sqlite3 bajo cygwin en Windows 7.

Respuesta

113

Obtienes una gratis, llamada ROWID. Esto está en cada tabla de SQLite ya sea que lo solicite o no.

Si incluye una columna del tipo INTEGER PRIMARY KEY, esa columna apunta a (es un alias para) la columna ROWID automática.

ROWID (con el nombre que se le llame) se le asigna un valor cada vez que INSERTAR una fila, como era de esperar. Si asigna explícitamente un valor que no sea NULL en INSERTAR, obtendrá ese valor especificado en lugar del incremento automático. Si asigna explícitamente un valor de NULL en INSERTAR, obtendrá el siguiente valor de incremento automático.

También, usted debe tratar de evitar:

INSERT INTO people VALUES ("John", "Smith"); 

y utilizar

INSERT INTO people (first_name, last_name) VALUES ("John", "Smith"); 

lugar. La primera versión es muy frágil: si alguna vez agrega, mueve o elimina columnas en la definición de su tabla, INSERT fallará o producirá datos incorrectos (con los valores en las columnas incorrectas).

+28

ROWID no es lo mismo que una verdadera autoincrementación, ya que el MISMO valor se puede generar más de una vez. Por ejemplo, con una tabla vacía, al insertar 3 filas, la tercera fila tiene un ROWID de 3 como se esperaba. Sin embargo, inserte 2 filas, elimine la última e inserte otra, le da a la tercera fila insertada un ROWID de 2, tal como lo hizo la segunda fila. Por lo tanto, existe un serio problema obvio si las tablas hacen referencia a los ROWID en una tabla donde ocurren las eliminaciones y donde las eliminaciones o la anulación de ROWID tampoco se realizan en las tablas relacionadas. – Nick

+2

En caso de que no sea obvio por la respuesta, puede usar ROWID en su declaración seleccionada, p. 'seleccione rowid de personas;' –

8

Ha leído esto? How do I create an AUTOINCREMENT field.

INSERT INTO people 
VALUES (NULL, "John", "Smith"); 
+0

Entonces, lo que está diciendo es que lo que estoy tratando de hacer no es posible, pero puedo simular algo. Necesito usar un nulo en el inserto? – ewok

+1

no necesita hacer nada más que insertar siempre NULL como ID, simplemente explica cómo sqlite lo hace internamente. –

+5

El NULL en INSERT es * solo * obligatorio si no especifica la lista de columnas para INSERTAR (en cuyo caso, necesita un número de valores que coincidan exactamente con el número de columnas y debe usar NULL como marcador de posición). Pero hacer un INSERT sin especificar la lista de columnas nunca es una buena práctica. Si especifica la lista de columnas, simplemente omita tanto la columna de autoincrement como el valor NULL, y obtendrá el resultado que espera. –

24

Sí, esto es posible. De acuerdo con los documentos de SQLite, 'Una columna declarada INTEGER PRIMARY KEY se autoincrementará'. (http://www.sqlite.org/autoinc.html)

+6

La advertencia, según lo mencionado por Uku, y también explicado en la documentación, es que debe pasar un NULO para la identificación para que esto funcione. –

+11

Solo * necesita * utilizar un NULO si omite la lista de columnas para INSERTAR: nunca es una buena práctica. Si especifica las columnas, simplemente puede omitir la columna de incremento automático y recibirá el siguiente valor. –

2

Al lado de rowid, puede definir su propio campo de incremento automático pero no es recomendable. Siempre es una mejor solución cuando usamos rowid que se incrementa automáticamente.

La palabra clave AUTOINCREMENT impone extra de CPU, memoria, espacio en disco, y /S de disco gastos generales y debe ser evitado si no es estrictamente necesario. Es generalmente no es necesario.

Lea here para obtener información detallada.

+0

aparentemente rowid no siempre se aumenta automáticamente, vea el comentario de Nick – rogerdpack

+0

No es cierto. El incremento automático es mejor en algunos aspectos, ya que no reutilizará los ID, un requisito bastante importante para muchos sistemas. –

2

SQLite AUTOINCREMENT es una palabra clave utilizada para aumentar automáticamente el valor de un campo en la tabla. Podemos auto incrementar el valor de un campo usando la palabra clave AUTOINCREMENT al crear una tabla con un nombre de columna específico para incrementarla automáticamente.

La palabra clave AUTOINCREMENT se puede utilizar con el campo INTEGER solamente. Sintaxis:

El uso básico de la palabra clave de incremento automático es el siguiente:

CREATE TABLE nombre_tabla ( column1 INTEGER AutoIncrement, tipo de datos columna2, column3 tipo de datos, ..... columnn tipo de datos, ) ;

Por ejemplo ver más abajo: Considere mesa empresa a ser creado de la siguiente manera:

sqlite> Crear TB_COMPANY_INFO TABLA ( ID INTEGER PRIMARY KEY AutoIncrement, NOMBRE DE TEXTO NO NULO, EDAD INT NOT NULL, DIRECCIÓN CHAR (50), SALARIO REAL );

Ahora, inserto siguientes registros en la tabla TB_COMPANY_INFO:

INSERT INTO TB_COMPANY_INFO (nombre, edad, dirección, SALARIO) VALORES ('Manoj Kumar', 40 'Meerut, UP, India', 200.000,00);

Ahora seleccione el registro SELECT * FROM TB_COMPANY_INFO ID NOMBRE EDAD DIRECCIÓN SALARIO 1 Manoj Kumar 40 Meerut, plano, India 200.000,00

2

No se debe especificar la palabra clave AUTOINCREMENT cerca PRIMARY KEY. Ejemplo de creación de la clave principal y la inserción de incremento automático:

$ sqlite3 ex1 

CREATE TABLE IF NOT EXISTS room(room_id INTEGER PRIMARY KEY, name VARCHAR(25) NOT NULL, home_id VARCHAR(25) NOT NULL); 

INSERT INTO room(name, home_id) VALUES ('test', 'home id test'); 

INSERT INTO room(name, home_id) VALUES ('test 2', 'home id test 2'); 

SELECT * FROM room; 

dará:

1|test|home id test 
2|test 2|home id test 2 
0

sé que esta respuesta es un poco tarde.
Mi propósito para esta respuesta es para la referencia de todos si encuentran este tipo de desafío con SQLite ahora o en el futuro y están teniendo dificultades con él.

Ahora, volviendo a su consulta, debería ser algo como esto.

CREATE TABLE people (id integer primary key autoincrement, first_name varchar(20), last_name varchar(20)); 

Funciona en mi extremo. Como tal,

enter image description here

En caso de que están trabajando con SQLite, le sugiero que consulte a cabo DB Browser for SQLite. Funciona en diferentes plataformas también.

Cuestiones relacionadas