Скрипты, внешние ключи и триггеры базы данных в phpmyadmin

В прошлый раз мы создали таблицы для нашей системы. Теперь для полного счастья осталось:

  • выполнить скрипт модуля авторизации, чтобы и он свои таблицы создал;
  • создать триггеры для подсчета баланса;
  • создать внешние ключи;

Скрипт импорта таблиц модуля авторизации tank_auth можно найти в архиве с исходниками. Скачайте архив по ссылке "Download Tank Auth", распакуйте и найдите файл schema.sql. Этот sql скрипт нам нужно импортировать в нашу базу данных. Авторизуйтесь в phpmyadmin, найдите вкладку импорт и загрузите скрипт в базу. Если ошибок не возникло, таблицы должны появится.

Вообще все это было бы проще и легче, если бы я записал скринкаст, но я как-то не пробовал. Может так было бы гораздо проще?!

Теперь создадим внешние ключи. У нас их всего два:

  • поле user_id в таблице accounts, связано с полем id в users
  • поле acc_id в таблице operations, связано с полем id в accounts

Чтобы создать внешние ключи, нужно сначала создать индексы по этим полям. Для создания индексов по полям на которые будут наложены вншение ключи на странице структуры таблицы напротив соответствующего поля найдите кнопку для создания индекса (она одна из тех, что справа). После создания индекса, откройте вкладку "Структура" и под списком полей найдите ссылку "связи". Откроется страница изменения связей (ссылка на скрин для таблицы accounts). Из списка выберите поле для связи и укажите действие CASCADE при удалении (ON DELETE). ON UPDATE можно оставить, ибо значения ключевые полей у нас изменяться не будут. Сохраняете. Аналогично для таблицы operations.

Теперь остается последнее. Нужно создать три триггера на таблицу operations. При вставке, обновлении и удалении строки. Они очень похожи. Не знаю был ли у вас курс по базам данных, но даже если был там могли не затрагиваться вопросы создания триггеров.

Суть триггера проста: по сути это хранимая процедура выполняемая при определенных событиях, таких, как удаление строки. Триггер устанавливается для определенной таблицы и определенное событие. Именно поэтому их у нас 3. В функциях триггера доступны старая (изменяемая) и новая (добавлеямая) строки под именами переменных OLD и NEW, соответственно. В триггере удаления строки нет новой, а в триггере вставки строки нет старой. Используя эти переменные мы определяем изменяется ли значение в поле amount (сумма) таблицы operations и обновлем баланс в таблице accounts. Так что скачиваем скрипт и импортируем так же как и первый. Вот собственно и он:

DELIMITER $$

DROP TRIGGER IF EXISTS operation_bu$$

CREATE TRIGGER operation_bu BEFORE UPDATE ON `operations`
FOR EACH ROW
BEGIN
IF NEW.done THEN
IF OLD.done THEN
IF OLD.amount <> NEW.amount THEN
UPDATE accounts as acc
SET acc.balance = acc.balance + NEW.amount - OLD.amount
WHERE acc.id = NEW.acc_id;
END IF;
ELSE
UPDATE accounts as acc
SET acc.balance = acc.balance + NEW.amount
WHERE acc.id = NEW.acc_id;
END IF;
ELSE
IF OLD.done THEN
UPDATE accounts as acc
SET acc.balance = acc.balance - OLD.amount
WHERE acc.id = NEW.acc_id;
END IF;
END IF;
END$$

DROP TRIGGER IF EXISTS operation_bi$$

CREATE TRIGGER operation_bi BEFORE INSERT ON `operations`
FOR EACH ROW
BEGIN
IF NEW.done THEN
UPDATE accounts as acc
SET acc.balance = acc.balance + NEW.amount
WHERE acc.id = NEW.acc_id;
END IF;
END$$

DROP TRIGGER IF EXISTS operation_bd$$

CREATE TRIGGER operation_bd BEFORE DELETE ON `operations`
FOR EACH ROW
BEGIN
IF OLD.done THEN
UPDATE accounts as acc
SET acc.balance = acc.balance - OLD.amount
WHERE acc.id = OLD.acc_id;
END IF;
END$$

DELIMITER ;

Если почитать,  то все становится понятным. Надеюсь в какой-то степени вы знакомы с sql. Если имена ваших столбцов отличаются то его не сложно переделать. Если будут вопросы по работе скриптов спрашивайте.

Дальше поговорим об установке и настройке codeigniter для нашего проекта.

вернуться назад

Комментарии

не не найдена

а доступа нет) веб-серверу не понравилось что я дал ссылку на sql скрипт. Запаковал. Ссылку исправил.