Hay Hay un par de maneras de restringir una tabla a 100 filas. (Por razones de brevedad, 5 filas en el código a continuación). Probado en SQLite versión 3.7.9.
Todo este código se basa en un tipo de peculiaridad en la forma en que SQLite maneja las declaraciones de tipos de datos. (De todos modos, me parece peculiar). SQLite te permite insertar disparates como 3.14159 y 'wibble' en una columna entera desnuda. Pero le permite insertar solo enteros en una columna declarada integer primary key
o integer primary key autoincrement
.
restricción FOREIGN KEY
Utilice una restricción de clave externa a una tabla de números de identificación válidos para garantizar que los números de identificación están en el rango que desea. Las restricciones de clave externa funcionan incluso en columnas autoincrementing.
pragma foreign_keys=on;
create table row_numbers (n integer primary key);
insert into row_numbers values (1);
insert into row_numbers values (2);
insert into row_numbers values (3);
insert into row_numbers values (4);
insert into row_numbers values (5);
create table test_row_numbers (
row_id integer primary key autoincrement,
other_columns varchar(35) not null,
foreign key (row_id) references row_numbers (n)
);
insert into test_row_numbers (other_columns) values ('s');
insert into test_row_numbers (other_columns) values ('s');
insert into test_row_numbers (other_columns) values ('s');
insert into test_row_numbers (other_columns) values ('s');
insert into test_row_numbers (other_columns) values ('s');
La sexta inserción falla con "Error: restricción de clave externa fallida".
No piensa El uso de un autoincrement es completamente seguro. En otras plataformas, una reversión dejaría un espacio en la secuencia. Si no usa una autoincrementación, puede insertar filas de forma segura seleccionando el número de identificación de "row_numbers".
insert into test_row_numbers values
(
(select min(n)
from row_numbers
where n not in
(select row_id from test_row_numbers)),
's'
);
CHECK() limitación
La restricción de clave principal a continuación garantiza los números de identificación serán enteros. La restricción CHECK() garantiza que los enteros estarán en el rango correcto. Es posible que tu aplicación tenga que ocuparse de las lagunas causadas por las reversiones.
create table test_row_numbers (
row_id integer primary key autoincrement,
other_columns varchar(35) not null,
check (row_id between 1 and 5)
);
Supongo que me falta algo, pero ¿no siempre actualizaría la última fila? Supongo que olvidé mencionar en mi publicación original, pero me gustaría mostrar, por ejemplo, las últimas 5 acciones/eventos independientemente de su antigüedad, no solo de la última. Gracias sin embargo. –
@Blaenk: suponiendo que su actualización establece el campo de fecha y hora en la hora actual para cada fila que toca, esto debería pasar por las filas en orden cronológico. –
Oohhh, y luego también actualiza el campo datetime del curso, que luego lo convertiría en la fila más nueva, ¿verdad? Ya veo. Hmm, esto es interesante. ¿Existe una forma simple de predecir una cierta cantidad de filas 'ficticias'? –