Está en la página 1de 7

Establecer claves foraneas e integridad referencial en SQLite Blog de Abelardo Jara Ber...

Page 1 of 7

Blog de Abelardo Jara Berrocal: Ubuntu, electronica y software libre Consejos para Ubuntu, electronica y software libre
Search

Buscar en este Blog

Inicio Acerca de m Cual usar? Java o C# Mono .NET o C++ con wxWidgets para desarrollo multiplataforma. Desarrollando con Mono y SharpDevelop en Windows 25nov

Establecer claves foraneas e integridad referencial en SQLite


Posted noviembre 25, 2007 by Abelardo Jara in Bases de datos. 1 comentario SQLite es un excelente motor de bases de datos unipersonales, parecido a Access. Tiene versiones para Windows y Linux y tiene interfaces para muchos lenguajes de programacion como Java, C++, Perl, PHP, ADO .NET La gran ventaja es que nuestra aplicacion se puede distribuir con el motor SQLite instalado dentro de ella (embebido) asi que el cliente no tiene que configurar nada en su maquina (ODBC, instalar y configurar Postgres, MySQL, SQL Server etc), solo correr nuestra aplicacion. SQLite parsea claves foraneas e integridad referencial en la definicion del esquema, pero no hace nada con ellas ni las incluye en la metadata. La solucion mas usada es usar triggers. En este post de otro blog encontre la solucion al problema: Tomado de: http://www.justatheory.com/computers/databases/sqlite/ Aqui empieza: After some some Googling and experimentation, Ive figured out how to enforce foreign key constraints in SQLite. I got most of the code from Cody Pistos sqlite_fk utility. I couldnt get it to work, but the essential code for the triggers was in its fk.c file, so I just borrowed from that (public domain) code to figure it out. Since I couldnt find documentation for this elsewhere on the Net (though Im sure it exists somewhere), I decided to just put an example here. Interested? Read on! Say you have these two table declarations:
Follow

file:///C:/Users/903386/Downloads/Establecer%20claves%20foraneas%20e%20integridad... 12/8/2011

Establecer claves foraneas e integridad referencial en SQLite Blog de Abelardo Jara Ber... Page 2 of 7

create table foo ( id INTEGER NOT NULL PRIMARY KEY );CREATE TABLE bar ( id INTEGER NOT NULL PRIMARY KEY, foo_id INTEGER NOT NULL CONSTRAINT fk_foo_id REFERENCES a(id) ON DELETE CASCADE );

Table bar has a foreign key reference to the primary key column in the foo table. Although SQLite supports this syntax (as well as named foreign key constraints), it ignores them. So if you want the references enforced, you need to create triggers to do the job. Triggers were added to SQLite version 2.5, so most users can take advantage of this feature. Each constraint must have three triggers: one for INSERTs, one for UPDATESs, and one for DELETESs. The INSERT trigger looks like this:
CREATE TRIGGER fki_bar_foo_id BEFORE INSERT ON bar FOR EACH ROW BEGIN SELECT CASE WHEN ((SELECT id FROM foo WHERE id = NEW.foo_id) IS NULL) THEN RAISE(ABORT, insert on table "bar" violates foreign key || constraint "fk_foo_id") END; END;

(You can put the RAISE error string all on one line; Ive concatenated two lines to keep line lengths reasonable here.) If your foreign key column is not NOT NULL, the triggers SELECT CASE clause needs to an extra case:
CREATE TRIGGER fki_bar_foo_id BEFORE INSERT ON bar FOR EACH ROW BEGIN SELECT CASE WHEN ((new.foo_id IS NOT NULL) AND ((SELECT id FROM foo WHERE id = new.foo_id) IS NULL)) THEN RAISE(ABORT, insert on table "bar" violates foreign key || constraint "fk_foo_id")
Follow

file:///C:/Users/903386/Downloads/Establecer%20claves%20foraneas%20e%20integridad... 12/8/2011

Establecer claves foraneas e integridad referencial en SQLite Blog de Abelardo Jara Ber... Page 3 of 7

END; END;

The UPDATE statements are almost identical; if your foreign key column is NOT NULL, then do this:
CREATE TRIGGER fku_bar_foo_id BEFORE UPDATE ON bar FOR EACH ROW BEGIN SELECT CASE WHEN ((SELECT id FROM foo WHERE id = new.foo_id) IS NULL)) THEN RAISE(ABORT, update on table "bar" violates foreign key || constraint "fk_foo_id") END; END;

And if NULLs are allowed, do this:


CREATE TRIGGER fku_bar_foo_id BEFORE UPDATE ON bar FOR EACH ROW BEGIN SELECT CASE WHEN ((new.foo_id IS NOT NULL) AND ((SELECT id FROM foo WHERE id = new.foo_id) IS NULL)) THEN RAISE(ABORT, update on table "bar" violates foreign key || constraint "fk_foo_id") END; END;

The DELETE trigger is, of course, the reverse of the INSERT and UPDATE triggers, in that it applies to the primary key table, rather than the foreign key table. To whit, in our example, it watches for DELETEs on the foo table:
CREATE TRIGGER fkd_bar_foo_id BEFORE DELETE ON foo FOR EACH ROW BEGIN SELECT CASE
Follow

file:///C:/Users/903386/Downloads/Establecer%20claves%20foraneas%20e%20integridad... 12/8/2011

Establecer claves foraneas e integridad referencial en SQLite Blog de Abelardo Jara Ber... Page 4 of 7

WHEN ((SELECT foo_id FROM bar WHERE foo_id = OLD.id) IS NOT NULL) THEN RAISE(ABORT, delete on table "foo" violates foreign key || constraint "fk_foo_id") END; END;

This trigger will prevent DELETEs on the foo table when there are existing foreign key references in the bar table. This is generally the default behavior in databases with referential integrity enforcement, sometimes specified explicitly as ON DELETE RESTRICT. But sometimes you want the deletes in the primary key table to cascade to the foreign key tables. Such is what our example declaration above specifies, and this is the trigger to to the job:
CREATE TRIGGER fkd_bar_foo_id BEFORE DELETE ON foo FOR EACH ROW BEGIN DELETE from bar WHERE foo_id = OLD.id; END;

Pretty simple, eh? The trigger support in SQLite is great for building your own referential integrity checks. Hopefully, these examples will get you started down the path of creating your own.

Be the first to like this post.

Una respuesta a esta entrada.


1. Publicado por Mocle en septiembre 8, 2009 at 1:06 pm Muy buen Tip! A desarrollar Triggers entonces. Responder

Deja un comentario

Follow

file:///C:/Users/903386/Downloads/Establecer%20claves%20foraneas%20e%20integridad... 12/8/2011

Establecer claves foraneas e integridad referencial en SQLite Blog de Abelardo Jara Ber... Page 5 of 7

Recibir siguientes comentarios por correo.

Publicar comentario

Pginas
Acerca de m

Administracion
Registrarse Acceder RSS de las entradas RSS de los comentarios WordPress.com

c
Elegir categora

Entradas recientes
Como enviar correos electronicos desde la linea de comando con sendemail en Ubuntu Encuesta: Habilitar chat de Facebook (XMPP) en Empathy (Ubuntu) Colocar un fondo de escritorio animado en Ubuntu Karmic y Lucid con Xwinwrap Mi primer video de Ubuntu usando OpenShot Que son las variables volatile y para que sirven? Mantener una coleccion ordenada de articulos tecnicos: usando Mendeley en Ubuntu
Follow

file:///C:/Users/903386/Downloads/Establecer%20claves%20foraneas%20e%20integridad... 12/8/2011

Establecer claves foraneas e integridad referencial en SQLite Blog de Abelardo Jara Ber... Page 6 of 7

Tutorial: Configurar EMACS como editor completo para C/C++, Python y VHDL (incluye configuracion del navegador con w3m, blogging con weblogger y correo con wanderlust) Instalar Google Earth 5 en Ubuntu e integrarlo con tu tema GTK preferido Simulador Modelsim 6.2 SE NATIVO para Ubuntu Linux 32 y 64 Instalar fuentes de Office 2007 en Ubuntu Tema de KDE 4 para Gnome Como empezar a programar microcontroladores PIC en Ubuntu Hardy Instalar MARS: ensamblador y simulador del procesador MIPS para cursos de Arquitectura de Computadoras en Ubuntu Usando el compilador de Microsoft Visual C++ 2005/2008 en Ubuntu Linux Extraer el contenido de un archivo RPM sin instalar en Ubuntu Instalar LabView 8.5 en Ubuntu Hardy y posteriores Uso de los paquetes .diff.gz para compilar aplicaciones en Linux/Ubuntu Optimizar el uso de bateria en Ubuntu Windows 7 vs Windows Vista vs Ubuntu Cambiar el nombre de cuenta de usuario en Ubuntu: Una forma sencilla Compilador online de codigo

Entradas mensuales
Elegir mes

Posts Ms Vistos
Un plugin muy rapido para descargar videos del YouTube Como usar SCP, el complemento de SSH para transmitir archivos y carpetas Generar archivo distribuible JAR en Netbeans Cambiar el nombre de cuenta de usuario en Ubuntu: Una forma sencilla Reparar memoria USB con Ubuntu Acceder a una base de datos SQLite con Java Unir varios PDFs en Ubuntu Compilacin cruzada: usando Ubuntu para compilar programas .exe para Windows Introduccin a la STL string en C++: conversion entre char* y string Instalar el IDE Code::Blocks para programacin C++ en Ubuntu Hardy (equivalente a Visual C++ para Linux) Expresiones Regulares en la shell: Ejemplos de uso con grep, awk y sed. Clonar particiones del disco duro con el comando DD

Comentarios recientes
antonio on Los estados de un proceso en U relajaoo on Codificar con script de bash t calomfix on Mantener una coleccion ordenad
Follow

file:///C:/Users/903386/Downloads/Establecer%20claves%20foraneas%20e%20integridad... 12/8/2011

Establecer claves foraneas e integridad referencial en SQLite Blog de Abelardo Jara Ber... Page 7 of 7

Luciano on Como enviar correos electronic

calomfix on Mantener una coleccion ordenad

Blog Stats
712,843 ubunteros y ubunteras

noviembre 2007 L M X J V S D 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 oct dic Blog de WordPress.com. Theme: Spring Loaded by the449.

Follow

file:///C:/Users/903386/Downloads/Establecer%20claves%20foraneas%20e%20integridad... 12/8/2011