Sa tu 4 tabele:

1. rachunki
- pozwala na zdefinoiwanie wielu rachunkow, dla ktorych beda rejestrowane operacje
- relacja 1-do-wielu z tabela grupy. Mozliwosc zdefiniowania wielu grup dla każdego z rachunkow (sluza one do grupowania operacji). w relacji zdefiniowane 'on delete cascade' (usuniecie rachunku ma czyscic wszystkie informacje z nim powiazane)
- relacja 1-do-wielu z tabela operacje 'on delete cascade' (jw.)
2. grupy
- mozliwosc zdeiniowania grup dla operacji
- relacja 1-do-wielu z tabela operacje. brak autoamtycznego kasowania operacji. Chodzi o to, aby niemozliwe bylo usuniecie grup, do ktorych juz sa przyporzadkowane operacje
3. operacje
- relacja 1-do-1 z tabela opisy. Ma na celu wyciagniecie opisow z tabeli operacje, gdyz i tak potrzebne sa rzadko a bywaja dlugie. 'on delete cascade'
4. opisy do operacji
Teraz jesli wypelniam tabele danymi (przykladowy kod do uzycia na koncu posta) i probuje usunac dany rachunek, wyskakuje blad z relacjami. Zakladam, ze chodzi o jakby podwojna rejacle pomiedzy rachunkami i operacjami (jedna bezposrednia a druga poprzez tabele grupy).
Czyli najprawdopodobniej przy usuwaniu rachunku dziala relacja do usuwania grup nalezacych do tego rachunku, ktore jednak nie moga byc usuniete, gdyz sa przyporzadkowane do nich operacje. Ale jesli by zdefiniowac kolejnosc dzialania relacji (przy usuwaniu rachunku najpierw usunac operacje do niego nalezace, adopiero potem grupy), wtedy wydaje mi sie, ze wszystko by zadzialalo. Nie wiem tylko jak to zrobic

struktura tabel + przykladowe dane:
-- MySQL dump 10.10 -- -- Host: localhost Database: rachunki -- ------------------------------------------------------ -- Server version 5.0.24a-community-nt /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; -- -- Table structure for table `grupy` -- DROP TABLE IF EXISTS `grupy`; CREATE TABLE `grupy` ( `id_grupa` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `id_rachunek` int(10) UNSIGNED NOT NULL, `grupa` varchar(127) collate utf8_polish_ci NOT NULL, PRIMARY KEY (`id_grupa`), KEY `id_rachunek` (`id_rachunek`), CONSTRAINT `grupy_ibfk_1` FOREIGN KEY (`id_rachunek`) REFERENCES `rachunki` (`id_rachunek`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci; -- -- Table structure for table `operacje` -- DROP TABLE IF EXISTS `operacje`; CREATE TABLE `operacje` ( `id_operacja` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `id_rachunek` int(10) UNSIGNED NOT NULL, `data` date NOT NULL, `typ` enum('przychod','rozchod') collate utf8_polish_ci NOT NULL, `kwota` int(10) UNSIGNED NOT NULL, `id_grupa` int(10) UNSIGNED NOT NULL, `opis_krotki` char(32) collate utf8_polish_ci NOT NULL, PRIMARY KEY (`id_operacja`), KEY `id_grupa` (`id_grupa`), KEY `id_rachunek` (`id_rachunek`), KEY `data` (`data`), KEY `typ` (`typ`), CONSTRAINT `operacje_ibfk_1` FOREIGN KEY (`id_grupa`) REFERENCES `grupy` (`id_grupa`), CONSTRAINT `operacje_ibfk_2` FOREIGN KEY (`id_rachunek`) REFERENCES `rachunki` (`id_rachunek`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci; -- -- Table structure for table `opisy` -- DROP TABLE IF EXISTS `opisy`; CREATE TABLE `opisy` ( `id_opis` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `id_operacja` int(10) UNSIGNED NOT NULL, `opis` text collate utf8_polish_ci NOT NULL, PRIMARY KEY (`id_opis`), KEY `id_operacja` (`id_operacja`), CONSTRAINT `opisy_ibfk_1` FOREIGN KEY (`id_operacja`) REFERENCES `operacje` (`id_operacja`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci; -- -- Table structure for table `rachunki` -- DROP TABLE IF EXISTS `rachunki`; CREATE TABLE `rachunki` ( `id_rachunek` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `rachunek` varchar(127) collate utf8_polish_ci NOT NULL, PRIMARY KEY (`id_rachunek`), UNIQUE KEY `rachunek` (`rachunek`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; INSERT INTO `rachunki` (`rachunek`) VALUES ('nazwa_rachunku'); INSERT INTO `grupy` (`id_rachunek`,`grupa`) VALUES (1,'nazwa_grupy_1'); INSERT INTO `grupy` (`id_rachunek`,`grupa`) VALUES (1,'nazwa_grupy_2'); INSERT INTO `operacje` (`id_rachunek`,`data`,`typ`,`kwota`,`id_grupa`,`opis_krotki`) VALUES(1,'2006-12-03','przychod',21,1,'opis'); INSERT INTO `opisy` (`id_operacja`,`opis`) VALUES (1,'opis dlugi2');
Teraz jesli sprobuje na takich danych wykonac zapytanie:
DELETE FROM `rachunki` WHERE `id_rachunek` =1
Otrzymam blad:
Kod
#1451 - Cannot delete or update a parent row: a foreign key constraint fails (`rachunki/operacje`, CONSTRAINT `operacje_ibfk_1` FOREIGN KEY (`id_grupa`) REFERENCES `grupy` (`id_grupa`))
Mam nadzieje, ze nie zakrecilem zbyt mocno i bede wdzieczny jesli ktos mnie nakieruje na rozwiazanie tego problemu.