Asegúrese de que la tabla SQLite solo tenga una fila

¿Cómo puedo hacer que una tabla tenga una sola fila? Debajo está lo que intenté. El activador UPDATE podría funcionar, sin embargo, el activador CREATE definitivamente no funcionará. Para CREATE, me gustaría usar SET , sin embargo, SET no es compatible con SQLite.

 CREATE TABLE IF NOT EXISTS `config` ( `id` TINYINT NOT NULL DEFAULT 0, `subdomain` VARCHAR(45) NOT NULL, `timezone` CHAR(3) NOT NULL, `timeout` TINYINT NOT NULL, `offline` TINYINT NOT NULL, `hash_config` CHAR(32) NOT NULL, `hash_points` CHAR(32) NOT NULL, PRIMARY KEY (`id`)); INSERT INTO config(id,subdomain,timezone,timeout,offline,hash_config,hash_points) VALUES(0,'subdomain','UTC',5,0,'hash_config','hash_points'); CREATE TRIGGER `config_insert_zero` BEFORE INSERT ON `config` FOR EACH ROW BEGIN -- SET NEW.id=0; NEW.id=OLD.id; END; CREATE TRIGGER `config_update_zero` BEFORE UPDATE ON `config` FOR EACH ROW BEGIN -- SET NEW.id=0; NEW.id=OLD.id; END; 

En el caso general, para limitar el número de filas en una tabla, debe evitar cualquier inserción adicional. En SQLite, esto se hace con RAISE () :

 CREATE TRIGGER config_no_insert BEFORE INSERT ON config WHEN (SELECT COUNT(*) FROM config) >= 1 -- limit here BEGIN SELECT RAISE(FAIL, 'only one row!'); END; 

Sin embargo, si el límite es uno, puede simplemente limitar la key primaria a un valor fijo:

 CREATE TABLE config ( id INTEGER PRIMARY KEY CHECK (id = 0), [...] ); 

Una idea que quizás desee considerar es hacer que parezca que la tabla tiene solo una fila. En realidad, mantienes todas las filas anteriores porque es muy posible que algún día quieras mantener un historial de todos los valores pasados.

Como solo hay una fila, realmente no hay necesidad de una columna de identificación, cuyo propósito es diferenciar de forma única cada fila de todas las demás. Sin embargo, necesita una timestamp que se usará para identificar la "fila" que será la última fila escrita en la tabla.

 CREATE TABLE `config_history` ( `created` timestamp default current_timestamp, `subdomain` VARCHAR(45) NOT NULL, `timezone` CHAR(3) NOT NULL, `timeout` TINYINT NOT NULL, `offline` TINYINT NOT NULL, `hash_config` CHAR(32) NOT NULL, `hash_points` CHAR(32) NOT NULL, PRIMARY KEY (`created`) ); 

Como normalmente solo está interesado en la última fila escrita (la última versión), la consulta selecciona la fila con la date de creación más reciente:

 select ch.created effective_date, ch.subdomain, ch.timezone, ch.timeout, ch.offline, ch.hash_config, ch.hash_points from config_history ch where ch.created =( select max( created ) from config_history ); 

Ponga una create view config as frente a esta consulta y tendrá una vista que selecciona solo una fila, la última, de la tabla. Cualquier consulta en la vista devuelve una fila:

 select * from config; 

En instead of desencadenar en la vista, puede convertir Actualizaciones en Encartes: en realidad no desea cambiar un valor, solo escriba una nueva fila con los nuevos valores. Esto se convierte en la nueva fila "actual".

Ahora tiene lo que parece ser una tabla con solo una fila, pero también mantiene un historial completo de todos los cambios realizados en esa fila.