Sqlite PRAGMA foreign_keys = 0 ?

Hello
Bon c’est pas fautes de rien comprendre a la base mai cette fois j’ai quand meme lu la doc (même si j’ai pas tout compris ):
sur le lien --> sqlite.com/foreignkeys.html#fk_basics
on peux lire

 The application can can also use a PRAGMA foreign_keys statement to determine if foreign keys are currently enabled. The following command-line session demonstrates this:

sqlite> PRAGMA foreign_keys;
0
sqlite> PRAGMA foreign_keys = ON;
sqlite> PRAGMA foreign_keys;
1
sqlite> PRAGMA foreign_keys = OFF;
sqlite> PRAGMA foreign_keys;
0

Tip: If the command "PRAGMA foreign_keys" returns no data instead of a single row containing "0" or "1", then the version of SQLite you are using does not support foreign keys (either because it is older than 3.6.19 or because it was compiled with SQLITE_OMIT_FOREIGN_KEY or SQLITE_OMIT_TRIGGER defined). 

bon alors

ii  libqt4-sql-sqlite                        4:4.6.3-4+squeeze1             Qt 4 SQLite 3 database driver
ii  libsqlite3-0                             3.7.3-1                        SQLite 3 shared library
ii  libsqlite3-dev                           3.7.3-1                        SQLite 3 development files
ii  sqlite3                                  3.7.3-1                        A command line interface for SQLite 3
ii  sqlite3-doc                              3.7.3-1                        SQLite 3 documentation
ii  sqlitebrowser                            1.3-2.3                        GUI editor for SQLite databases

Donc j’ouvre sqlitebrowser
je luis balance 2 requette:\ (il y a un onglet ou on peux)

CREATE TABLE IF NOT EXISTS TABLE_PRINCIPAL (ID INTEGER CONSTRAINT PM_KEY PRIMARY KEY,NOM text) CREATE TABLE IF NOT EXISTS TABLE_S (PRENOM text,SID INTEGER, FOREIGN KEY(SID) REFERENCES TABLE_PRINCIPAL (ID));

Ensuite:
sqlite PRAGMA foreign_keys et j’obtien 0
Ce qui veux dire que c est pas supporter .
si j’active l’option avec : PRAGMA foreign_keys = ON;

je sais pas ce que sa vaut exactement si c est valable sur toute les clef étrangère ou seulment sur celle qui existe. ?
sinon je peux faire quoi pour que sa soie activer par defauts ?
sqlite me suffirait pour peux qu’il supporte quand meme les relation … c’est la base tout de même … ?? :doh:

Je comprends pas ce qui te pose problème…

$ sqlite3 test.db SQLite version 3.7.9 2011-11-01 00:52:41 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> PRAGMA foreign_keys; 0 sqlite> PRAGMA foreign_keys = ON; sqlite> PRAGMA foreign_keys; 1 sqlite> CREATE TABLE master(id INTEGER PRIMARY KEY); sqlite> CREATE TABLE slave(mid INTEGER, name TEXT, FOREIGN KEY(mid) REFERENCES master(id)); sqlite> INSERT INTO slave(mid,name) VALUES(1,'a'); Error: foreign key constraint failed sqlite> INSERT INTO master(id) VALUES (1); sqlite> INSERT INTO slave(mid, name) VALUES(1,'a'); sqlite> .quit

Reformule stp, je ne comprends pas la question. :blush:

À chaque fois que tu ouvres une base qui en a besoin, de préférence avant de commencer à faire d’autres requêtes :

  • vérifier que PRAGMA foreign_keys; renvoie une valeur pour être sûr que la lib a été compilée avec le support des clés étrangères
  • puis PRAGMA foreign_keys = ON; pour activer la vérification des contraintes

Déjà faut pas confondre la capacité relationnelle (JOIN etc) avec les clés étrangères.
Ensuite, non, les clés étrangères c’est pas la base. Ça fait des années que j’utilise SQLite en prod sans clés étrangères (pour tout avouer, je savais même pas qu’elles étaient enfin implémentées, c’est une agréable surprise :mrgreen:) et ça se passe très bien. Aux dernières nouvelles (version 5.6), MySQL ne supporte les clés étrangères que sur les tables InnoDB alors que la très grosse majorité des applications utilise des tables MyISAM, et ça se passe très bien aussi. Il suffit de coder en conséquence.
Enfin, SQLite supporte très bien les clés étrangères (la preuve par le code ci-dessus) si la lib a été compilée avec l’option, simplement même dans ce cas elles ne sont pas activées par défaut, il faut faire le PRAGMA toi-même (ce qui est tout à fait logique ne serait-ce que pour des questions de rétro-compatibilité avec les applications existantes qui utilisaient un SQLite où les clés étrangères n’existaient pas encore).

[quote=“syam”]Je comprends pas ce qui te pose problème…

$ sqlite3 test.db SQLite version 3.7.9 2011-11-01 00:52:41 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> PRAGMA foreign_keys; 0 sqlite> PRAGMA foreign_keys = ON; sqlite> PRAGMA foreign_keys; 1 sqlite> CREATE TABLE master(id INTEGER PRIMARY KEY); sqlite> CREATE TABLE slave(mid INTEGER, name TEXT, FOREIGN KEY(mid) REFERENCES master(id)); sqlite> INSERT INTO slave(mid,name) VALUES(1,'a'); Error: foreign key constraint failed sqlite> INSERT INTO master(id) VALUES (1); sqlite> INSERT INTO slave(mid, name) VALUES(1,'a'); sqlite> .quit

Reformule stp, je ne comprends pas la question. :blush:

À chaque fois que tu ouvres une base qui en a besoin, de préférence avant de commencer à faire d’autres requêtes :

  • vérifier que PRAGMA foreign_keys; renvoie une valeur pour être sûr que la lib a été compilée avec le support des clés étrangères
  • puis PRAGMA foreign_keys = ON; pour activer la vérification des contraintes

Déjà faut pas confondre la capacité relationnelle (JOIN etc) avec les clés étrangères.
Ensuite, non, les clés étrangères c’est pas la base. Ça fait des années que j’utilise SQLite en prod sans clés étrangères (pour tout avouer, je savais même pas qu’elles étaient enfin implémentées, c’est une agréable surprise :mrgreen:) et ça se passe très bien. Aux dernières nouvelles (version 5.6), MySQL ne supporte les clés étrangères que sur les tables InnoDB alors que la très grosse majorité des applications utilise des tables MyISAM, et ça se passe très bien aussi. Il suffit de coder en conséquence.
Enfin, SQLite supporte très bien les clés étrangères (la preuve par le code ci-dessus) si la lib a été compilée avec l’option, simplement même dans ce cas elles ne sont pas activées par défaut, il faut faire le PRAGMA toi-même (ce qui est tout à fait logique ne serait-ce que pour des questions de rétro-compatibilité avec les applications existantes qui utilisaient un SQLite où les clés étrangères n’existaient pas encore).[/quote]

pour la reformule: :think:
tu as déjà une(plusieurs) requête qui possède une clef étranger:
1.- la on c’est que c’est pas activer.je fait donc:

PRAGMA foreign_keys = ON;

2.- est-ce que toute les requetes son activée d’un coup, ou il faut que je me taper :
PRAGMA foreign_keys = ON;
avant chaque requête ?

note:
Pour la question du JOIN:
si on as une clef primaire dans une table, —> pour conserver dans une autre table plusieurs enregistrement qui on le meme ID que la table primaire.

Merci pour ta réponse :006

[quote=“panthere”]tu as déjà une(plusieurs) requête qui possède une clef étranger:
1.- la on c’est que c’est pas activer.je fait donc:

2.- est-ce que toute les requetes son activée d’un coup, ou il faut que je me taper :
PRAGMA foreign_keys = ON;
avant chaque requête ?[/quote]

[quote=“http://www.sqlite.org/foreignkeys.html”]2. Enabling Foreign Key Support
[…]
Foreign key constraints are disabled by default (for backwards compatibility), so must be enabled separately for each database connection separately.[/quote]
En clair, ça veut dire que :

  1. il faut activer la vérification d’intégrité référentielle pour chaque base que tu ouvres
  2. une fois activée pour une base donnée, toutes les requêtes sur cette base en tiendront compte

[quote=“panthere”]note:
Pour la question du JOIN:
si on as une clef primaire dans une table, —> pour conserver dans une autre table plusieurs enregistrement qui on le meme ID que la table primaire.[/quote]
Que les clés étrangères soient vérifiées automatiquement (ou pas) par le moteur SQLite ne change rien à ton modèle de données : dans tous les cas tu peux stocker et exploiter des données “un à plusieurs”, la seule différence est que, avec la vérification des clés étrangères, SQLite va te générer une erreur si tu insères des données erronées (ce qui ne devrait normalement pas arriver si ton code est correct).