Fork me on GitHub

The WebDevil

Enjoy development

В университете в свое время у нас был курс по БД. Опирался он на Oracle. Но принципы и поняти были совсем общие. Так вот, там нам рассказывали по “ограничения целостности БД”.

В двух словах, что это такое, а потом, как это работает в MySQL и какие ошибки при этом случаются.

Ограничения целостности позволяют поддерживать отношения между таблицами. MySQL, Oracle на то и называются СУРБД – системами управления реляционными БД. Т.е. между таблицами (сущностями) есть определенные декартовы отношения.
Пример: есть таблица студентов и таблица факультетов. Условие: при удалении факультета удалить все записи студентов.

Другой пример: таблица “группы новостей” и “новости”. При удалении группы удалить ее новости.

А теперь как это работает в MySQL.

В MySQL есть различные типа таблиц. Одни хранят все значения в памяти (MEMORY), другие хранят данные без индексирования (ARCHIVE), еще одни хранят данные в текстовых БД (CSV).

По умолчанию мускуль использует MYISAM.

MyISAM

manages non-transactional tables. It provides high-speed storage and retrieval, as well as fulltext searching capabilities.

MyISAM

is 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

InnoDB

and

BDB

storage engines provide transaction-safe tables.

BDB

is included in MySQL-Max binary distributions on those operating systems that support it.

InnoDB

is 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.

Comments are closed.