Na databáze s SQLite – díl 7.

V tomto díle bych rád upozornil na jedno úskalí, s nímž jsem se během práce s SQLite setkal. Tím je nutnost nastavování, že jsou povolené cizí klíče pomocí PRAGMA foreign_keys = ON.

V jednom projektu mi totiž nechtělo fungovat ON DELETE CASCADE. V databázi by to správně mělo fungovat tak, že když smažete tabulku, která je rodičem jiné (a je vše samozřejmě správně spárováno pomocí primárních a cizích klíčů), tak se smažou i všechny záznamy jejích cizích klíčů u všech tabulek, jenž jsou její potomci. A mně ne a ne to fungovat.

Problém byl v tom, že jsem nenastavil PRAGMA foreign_keys. Takže pokud byste někdy také přišli do styku s podbným problémem, s každým novým new PDO nezapomeňte nastavit PRAGMA foreign_keys = ON a ušetříte si spoustu starostí. CASCADE by již měly bez problémů zafungovat.

Zde je ukázka (DELETE dotaz můžete zkusit sami):

<?php
 
try {
 
  $db = new PDO('sqlite:nazevdb.db3');
 
  // prikaz
  $sqldotaz = '
 
  PRAGMA foreign_keys = ON;
 
   DROP TABLE IF EXISTS "tabulka";
   DROP TABLE IF EXISTS "potomek";
 
  CREATE TABLE "tabulka" (
   "idt" INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL ,
   "nazev" VARCHAR NOT NULL ,
   "popis" VARCHAR NOT NULL
  );
 
  CREATE TABLE "potomek" (
   "idp" INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL ,
   "tid" INTEGER NOT NULL,
   "nazev" VARCHAR NOT NULL ,        
   FOREIGN KEY(tid) REFERENCES tabulka(idt) ON UPDATE NO ACTION ON DELETE CASCADE
 
  );
 
  '; 
 
  $db->exec($sqldotaz); 
 
  $db = NULL;                    // ukoncit spojeni s db
 
} catch(PDOException $e) {
 
  if (isset($db)) {unset($db);}  // ukoncit spojeni s db
  die($e->getMessage());         // ukoncit skript
 
}
 
?>

Tak, jak je to v ukázce, by už to mělo bez problémů fungovat. Ještě doplním jednu poznámku z minula, že pokud chcete vypisovat jen jeden řádek, nemusíte používat fetchall, stačí pouze fetch v kombinaci s normálním polem (už ne asociativním), tedy není třeba argumentu předávat PDO:FETCH:ASSOC.

A to by mělo být tedy z toho seriálu vše. Pokud tedy během práce s SQlite nenarazím opět na nějaký zajímavý problém, se kterým bych se rád podělil s ostatními.

O Petr Fořt

Student ČVUT FJFI KSE ASI (Softwarové inženýrství v ekonomii). Zajímám se o počítače (programování, diagnostika chyb hw), hudbu. Mám rád grilování, táboráky, hraní na kytaru a srandu v dobré společnosti.