2010-06-11 15 views
8

¿Por qué la restricción de la clave externa (aunque se ejecuta correctamente) no se aplica por SQLite? ¿Cómo puedo hacer para reforzar la relación?No se aplica la clave externa

CREATE TABLE User (
    UserID TEXT Unique NOT NULL PRIMARY KEY, 
    FirstName TEXT NOT NULL, 
    LastName TEXT NOT NULL, 
    Username TEXT NOT NULL, 
    Password TEXT NOT NULL, 
    Email TEXT NOT NULL, 
    SignupDate TEXT NOT NULL 
) 

CREATE TABLE Category (
    CategoryID TEXT Unique NOT NULL PRIMARY KEY, 
    UserID TEXT, 
    FOREIGN KEY(UserID) REFERENCES User(UserID) 
) 

Respuesta

12

Como the relevant docs dicen (en la sección 2. Activación de Asuntos Exteriores de soporte clave):

Assuming the library is compiled with foreign key constraints enabled, it must still be enabled by the application at runtime, using the PRAGMA foreign_keys command. For example:

sqlite> PRAGMA foreign_keys = ON;

Foreign key constraints are disabled by default (for backwards compatibility), so must be enabled separately for each database connection separately.

¿Ha utilizado PRAGMA que en la conexión relevante? (Suponiendo, como dicen los documentos, que sqlite se compila adecuadamente, y también una versión lo suficientemente reciente para ofrecer la aplicación de restricciones de claves foráneas, por supuesto).

+0

Muchas gracias por la pronta respuesta. Nunca me di cuenta de eso en la documentación (se verá más difícil la próxima vez). Habiendo intentado ejecutar ese comando, recibo el siguiente error: "SQLite prepare() failed. ERROR: authorization denied DETAILS: not authorised EXPRESSION: PRAGMA foreign_keys = ON;" Supongo que la versión que están utilizando no la admite o ha tenido la funcionalidad deshabilitada. ¿Podría crear el mismo resultado final usando desencadenadores? Si es así, ¿podría alguien proporcionar algún ejemplo de sintaxis de activación para SQLITE? –

+0

@Maxim, creo que los desencadenadores de clave externa sqlite requieren exactamente la misma funcionalidad subyacente que las antiguas claves externas (a menudo se eliminan en compilaciones incorporadas de sqlite que quieren ser pequeñas y rápidas más de lo que desean ofrecer "potencia ACID relacional completa" en rendimiento sustancial y costos de huella). –

3

También puede activar el soporte clave externa a través de la incorporación en connectionstring:

foreign keys=True 

Ejemplo:

"Data Source={DatabaseFullFilePath};Version=3;foreign keys=True;datetimeformat=CurrentCulture" 
Cuestiones relacionadas