2012-02-18 46 views
20

Tengo el siguiente código SQLite. ¿Cómo inserto una identificación única que genera automáticamente en cada fila?¿Cómo insertar una ID única en cada fila de SQLite?

tx.executeSql('DROP TABLE IF EXISTS ENTRIES'); 
    tx.executeSql('CREATE TABLE IF NOT EXISTS ENTRIES (id unique, data)'); 

    tx.executeSql('INSERT INTO ENTRIES (id, data) VALUES (1, "First row")'); 
    tx.executeSql('INSERT INTO ENTRIES (id, data) VALUES (2, "Second row")'); 

Respuesta

27

Se podría definir id como auto increment column:

create table entries (id integer primary key autoincrement, data) 

Como notas MichaelDorner, la SQLite documentation dice que un integer primary key hace lo mismo y es un poco más rápido . Una columna de ese tipo es un alias para rowid, que behaves like an autoincrement column.

create table entries (id integer primary key, data) 

Este comportamiento es implícito y podría atrapar desprevenidos a los inexpertos desarrolladores de SQLite.

+1

Aviso, que "La palabra clave AutoIncrement impone extra de CPU, memoria, espacio en disco, y el disco sobrecarga de E/S y debe ser evitado si no es estrictamente necesario. Se por lo general no es necesario ". (https://www.sqlite.org/autoinc.html) –

+0

@MichaelDorner: Gracias, interesante, he actualizado la respuesta. – Andomar

+2

Tenga en cuenta que * tiene * para ser 'entero' y no' int' en PHP con PDO, de lo contrario no establece automáticamente la identificación. – starbeamrainbowlabs

2

autoincrement es tu amigo amigo.

CREATE TABLE IF NOT EXISTS ENTRIES (id integer primary key autoincrement, data); 
INSERT INTO ENTRIES (data) VALUES ("First row"); 
INSERT INTO ENTRIES (data) VALUES ("Second row"); 

y luego:

> SELECT * FROM ENTRIES; 
1|First row 
2|Second row 
14

Esta es la sintaxis que uso.

id INTEGER PRIMARY KEY AUTOINCREMENT, 

simplemente no proporcionan datos para la columna de incremento automático

tx.executeSql('INSERT INTO ENTRIES (id, data) VALUES (NULL, "First row")'); 

O aún más simple

tx.executeSql('INSERT INTO ENTRIES (data) VALUES ("First row")'); 
0

para el INSERT, mejor dar un valor "nulo" para el valor de incremento automático correspondiente de signo de interrogación marcador de posición

tx.executeSql('INSERT INTO ENTRIES (id, data) VALUES (?, ?)', [null, "First row"]); 
0

Esto funcionó perfectamente para mí

c.execute('INSERT INTO WEBSITES (url) VALUES (?)', [url]) 
Cuestiones relacionadas