В университете в свое время у нас был курс по БД. Опирался он на Oracle. Но принципы и поняти были совсем общие. Так вот, там нам рассказывали по “ограничения целостности БД”.
В двух словах, что это такое, а потом, как это работает в MySQL и какие ошибки при этом случаются.
Ограничения целостности позволяют поддерживать отношения между таблицами. MySQL, Oracle на то и называются СУРБД – системами управления реляционными БД. Т.е. между таблицами (сущностями) есть определенные декартовы отношения.
Пример: есть таблица студентов и таблица факультетов. Условие: при удалении факультета удалить все записи студентов.
Другой пример: таблица “группы новостей” и “новости”. При удалении группы удалить ее новости.
А теперь как это работает в MySQL.
В MySQL есть различные типа таблиц. Одни хранят все значения в памяти (MEMORY), другие хранят данные без индексирования (ARCHIVE), еще одни хранят данные в текстовых БД (CSV).
По умолчанию мускуль использует MYISAM.
MyISAMmanages non-transactional tables. It provides high-speed storage and retrieval, as well as fulltext searching capabilities.
MyISAMis supported in all MySQL configurations, and is the default storage engine unless you have configured MySQL to use a different one by default.
Теперь обратим внимание на ключевую фразу “non-transactional tables”. Меня такой тип не устраивает. Поэтому меня заинтересовал тип InnoDB.
The
InnoDBand
BDBstorage engines provide transaction-safe tables.
BDBis included in MySQL-Max binary distributions on those operating systems that support it.
InnoDBis also included by default in all MySQL 5.0 binary distributions. In source distributions, you can enable or disable either engine by configuring MySQL as you like.
В версии 5,1 обещают сделать MYISAM transaction-safe. Но пока используем InnoDB.
Итак, живой пример. Есть схема БД, приведена ниже. И на основе ее сгенерирован код.
[mysql]
SET FOREIGN_KEY_CHECKS=0;
– Drop table news_categories
DROP TABLE IF EXISTS `news_categories`;
CREATE TABLE `news_categories`
(
`idcategory` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`keyword` varchar(50) NOT NULL,
`category` text,
`picture` varchar(255),
`visible` tinyint(1),
PRIMARY KEY(`idcategory`),
UNIQUE INDEX `news_keyword`(`keyword`) )
TYPE=INNODB CHARACTER SET cp1251 ;
– Drop table news
DROP TABLE IF EXISTS `news`;
CREATE TABLE `news`
(`idnews` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`title` varchar(255),
`short` text,
`full` text,
`visible` tinyint(1),
`added` datetime,
`idcategory` int(11) UNSIGNED NOT NULL DEFAULT ‘0′,
PRIMARY KEY(`idnews`),
INDEX `FKIndex1`(`idcategory`),
INDEX `FKIndex2`(`idcategory`),
CONSTRAINT `Ref_02` FOREIGN KEY (`idcategory`)
REFERENCES `news_categories`(`idcategory`) ON DELETE CASCADE ON UPDATE CASCADE )
TYPE=INNODB CHARACTER SET cp1251 ;
SET FOREIGN_KEY_CHECKS=1;
[/mysql]
… из которого видно, что “ON DELETE CASCADE” – при удалении категории новостей будут удалены связанные с ней новости.
ЗЫ: для генерации использовался MircoOLAP DataBase Designer.