Jump to content
  • 0

Помощь с созданием триггера


Feers1de
 Share

Question

Доброго времени суток всем!

 

Язык SQL знаю поверхностно, а создавать триггеры - вовсе не умею. Прошу вашей помощи по созданию.

 

Имеется база данных products, в ней три таблицы - assembledcomponents (собранные компоненты), motherboards, processors, rams. В каждой таблице содержится первичный ключ, цена + тройка других ненужных столбцов. Первая таблица заполняется из остальных трёх (вручную).

 

Теперь суть триггера: Необходимо при каждой сборке полу-компьютера в таблице assembledcomponents суммировать цену (в поле Price) выбранных компонентов, взятых из других таблиц, в одно поле.

 

Постскриптум: Суть отразил, вроде, верно. Если возникнут вопросы - напишите.

Edited by Feers1de
Link to comment
Share on other sites

13 answers to this question

Recommended Posts

  • 0

не совсем понятно как это происходит на странице?

т.е. юзер через селекты там, радиобаттон, либо чекбокс что-то делает, потом сабмитит и данные заносятся в бд?

в принципе для этого триггеры вовсе не нужны, они нужны тогда, когда кол-во запросов к бд очень много.

Link to comment
Share on other sites

  • 0

Ну, всё это необходимо мне в СУБД phpmyadmin. И, да, на сайте тоже будет то, что Вы расписали.

 

То есть когда у меня имеется три последних заполненных таблицы (rams, motherboards, processors) с кучей (или по-одному на каждую) соответствующих компонентов\комплектующих - я могу заполнить четвёртую таблицу, данные в которой я заношу с помощью вышеперечисленных таблиц. Данные буду брать из первичных ключей.

Link to comment
Share on other sites

  • 0

assembledcomponents - я так понимаю там будет записываться комплект сборки ссылающийся на motherboards, processors, rams через первичный ключ на выбранные комплектующие, так же наверно и количество. Нужно ли вам в эту таблицу записывать получившуюся стоимость?

 

1. предположим у вас сменилась цена на комплектующие, стоимость сборок останется старой, возможно вам придется пробегать всю assembledcomponents  для смены стоимости сборок

2. если вам на сайте нужно будет выводить стоимость сборки можно ведь сделать выборку из assembledcomponents  и по ссылкам получить цены на комплектующие, а умножить на количество и сложить все это вроде даже не проблема.

3. если же вам нужно чтобы в assembledcomponents  хранилась история сборок, с ценами на время ее создания, то в процессе записи в эту таблицу делаем все тоже самое что и в пункте 2 :)

Edited by Switch74
  • Like 1
Link to comment
Share on other sites

  • 0

assembledcomponents - я так понимаю там будет записываться комплект сборки ссылающийся на motherboards, processors, rams через первичный ключ на выбранные комплектующие

Именно так.

так же наверно и количество. Нужно ли вам в эту таблицу записывать получившуюся стоимость?

В каждой таблице компоненты не будут дублироваться. Колонки "количество" у меня не присутствует. По поводу стоимости - вроде этого и добивался, если я Вас правильно понял.

1. предположим у вас сменилась цена на комплектующие, стоимость сборок останется старой, возможно вам придется пробегать всю assembledcomponents  для смены стоимости сборок

2. если вам на сайте нужно будет выводить стоимость сборки можно ведь сделать выборку из assembledcomponents  и по ссылкам получить цены на комплектующие, а умножить на количество и сложить все это вроде даже не проблема.

3. если же вам нужно чтобы в assembledcomponents  хранилась история сборок, с ценами на время ее создания, то в процессе записи в эту таблицу делаем все тоже самое что и в пункте 2 :)

1. Цену комплектующих я планирую менять, да. Стоимость сборки неплохо бы было обновить. Такое возможно?

2. Хм... На первом плане стоит база данных. То есть все операции с данными необходимо выполнять непосредственно в базе данных. Сайт - лишь дополнительное средство.

3. Историю сборок не планирую хранить. Правда тут не совсем понял.

Link to comment
Share on other sites

  • 0

так же наверно и количество. Нужно ли вам в эту таблицу записывать получившуюся стоимость?

В каждой таблице компоненты не будут дублироваться. Колонки "количество" у меня не присутствует. По поводу стоимости - вроде этого и добивался, если я Вас правильно понял.

смотрите, есть например материнки поддерживающие более 1 процессора и планок памяти (rams я так понимаю это они и есть), и если в сборке будет что-то подобное, то возможно есть смысл указывать количество и получится расчет стоимости исходя из этих данных сумма = ценаMB х 1 + ценаCPU х 2 + ценаRAM х 2

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

2. думаю при любой работе с базой будет не проблематично формировать стоимость сборки при обращении к базе данных, а не хранить их в ней же, что увеличит ее размеры. Если у вас assembledcomponents будет обрабатываться при отсутствии связи с остальными таблицами с ценами, тогда запись стоимости сборки конечно обязательна.

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

Edited by Switch74
Link to comment
Share on other sites

  • 0

Switch74, голова моя отказывается работать... :0

 

Может такой случай и будет, но его не стоит учитывать. Так как, во-первых, делаю я это для преподавателя, а не, напишем, для какого-то проекта; во-вторых, времени до окончания сдачи работы у меня крайне мало.

 

1. Количество строк в таблице особо не будет возрастать. Максимум 3-5 шт.

2. Скорее всего так и сделаю. Буду делать вычисления непосредственно на уровне сервера. И, кстати, у меня имеются вопросы по созданию связей между таблицами. Я их отдельно распишу.

3. Такое тоже не предполагается. Это лишь усложняет работу, на которую никто смотреть не будет. Но в чём-то Вы правы - если что-то делать, то с умом. Но, опять же, времени у меня в обрез. Потому что я двоечник и первые две недели потратил как раз таки на усложнение. Хотел создать чуть ли не проект. Когда понял, что необходимо много времени и знаний, - понял, что я бессилен.


Теперь вопрос касательно связей.

 

Имею phpmyadmin версии 4.2.2. Вы ведь всё ещё помните суть моей базы данных? Необходимо, чтобы в assembledcomponents при создании "сборки"\строки данные в последних трёх столбцах брались из последних трёх соответствующих таблиц (из первичных ключей). Это, вроде как, я сделал.

 

Но возникла небольшая проблема:

 

После создания "сборки"\строки в assembledcomponents я отредактировал в таблице processors одну из ячеек первичного ключа, которая уже используется в "сборке". В таблице сборок в созданной мной строке должны ли обновиться данные? Те, которые были затронуты.

Link to comment
Share on other sites

  • 0

если я правильно понял у вас что-то вроде такого должно получиться:

assembledcomponents

id|motherboards|processors|rams

1|1|1|1

motherboards

id|name|price

1|MB...|2000

processors

id|name|price

1|CPU...|5000

rams

id|name|price

1|RAM|1500

 

получается у нас есть комплектующие и сборка из них, в сборке указываются id данных комплектующих из соответствующих таблиц, если вы измените данные комплектующих например name или price ваша сборка автоматически должна будет иметь обновленные данные. Но вот id трогать запрещено

  • Like 1
Link to comment
Share on other sites

  • 0

я бы посоветовал вам использовать id с auto_increment, в большинстве случаев это выгодно, но судя по всему изменив ваш первичный ключ, вы нарушили связи и сборка будет не корректная уже

Link to comment
Share on other sites

  • 0

Теперь вопрос касательно связей.

Имею phpmyadmin версии 4.2.2. Вы ведь всё ещё помните суть моей базы данных? Необходимо, чтобы в assembledcomponents при создании "сборки"\строки данные в последних трёх столбцах брались из последних трёх соответствующих таблиц (из первичных ключей). Это, вроде как, я сделал.

Но возникла небольшая проблема: После создания "сборки"\строки в assembledcomponents я отредактировал в таблице processors одну из ячеек первичного ключа, которая уже используется в "сборке". В таблице сборок в созданной мной строке должны ли обновиться данные? Те, которые были затронуты.

Наверное, не заметили. Этот вопрос меня тоже волнует.

 

Иии ещё вопрос.

 

Имеется PHP переменная:

$sqltorams = "Insert into rams (PartNumber, FormFactor, Type, RAMPrice) Values('{$PartNumber}', '{$FormFactor}', '{$Type}', '{$RAMPrice}');";

И следующие строки PHP кода:

mysql_query($sqltorams);if (mysql_query($sqltorams) == false){   echo "Данные успешно добавлены.";}else if (mysql_query($sqltorams) == TRUE){   die ("Данные не добавлены. Возникла ошибка.");}

И тут я не понял. Почему mysql_query при удачном (то есть данные были добавлены в базу данных) исполнении возвращает false, а при неудачном (когда данные не были добавлены в базу данных) - true? Читал документацию на официальном сайте. Там всё совсем наоборот.

Edited by Feers1de
Link to comment
Share on other sites

  • 0

Есть замечательный фри инструмент для работы с БД: DevArt DBForge studio for MySQL. Там можно делать ОЧЕНЬ многое, для меня стал крайне незаменимым инструментом. Если дадите схему БД - напишу вам триггер(даже 2, нужно вешать триггер на UPDATE и на INSERT).

Но прежде убедитесь, что вам хостер разрешает пользовать триггеры(бывали ситуации, когда хостер не давал пользовать триггеры)

Вот вам шаблон(это шаблон, а не готовые триггеры, без правок он работать он не будет ):

таблица - замените на имя таблицы для которой создается,

подправить имена полей и добавить запросы ко всем нужным таблицам.

DELIMITER $$DROP TRIGGER IF EXISTS trg_BI_таблица$$CREATETRIGGER trg_BI_таблицаBEFORE INSERTON таблицаFOR EACH ROWBEGINDECLARE sum1,sum2,sum3 integer UNSIGNED DEFAULT 0;-- Выборка значения из интересующей таблицы в переменную.SELECT поле INTO sum1 FROM таблица WHERE улюч_таблицы = NEW.ключ LIMIT 1;-- Через NEW.имя_поля доступны все значения, которые будут записаны, их можно переопределить.SET NEW.поле := sum1 + sum2 + sum3;END$$DROP TRIGGER IF EXISTS trg_BU_rooms$$CREATETRIGGER trg_BU_roomsBEFORE UPDATEON roomsFOR EACH ROWBEGINDECLARE sum1,sum2,sum3 integer UNSIGNED DEFAULT 0;-- Выборка значения из интересующей таблицы в переменную.SELECT поле INTO sum1 FROM таблица WHERE улюч_таблицы = NEW.ключ LIMIT 1;-- Через NEW.имя_поля доступны все значения, которые будут записаны, их можно переопределить.SET NEW.поле := sum1 + sum2 + sum3;END$$DELIMITER ;
  • Like 1
Link to comment
Share on other sites

  • 0

К сожалению, помощь не требуется. Огромное спасибо всем за помощь.

А DevArt DBForge studio for MySQL - я воспользуюсь. Взял на заметку эту программу. Хостера у меня нету. Сервер стоит на локальном компьютере.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Similar Content

    • By Лелик
      Источник для импорта сменил кодировку с utf-8 на  windows-1251. Всвязи с этим не выполняются циклы импорта, ошибка 1064 и кириллица выводится в квадратах. Также вверху шапки сайта при загрузке страницы админки с импортом и при оформлении заказа (на другой линии) [Unknown: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in /home/p10824/xn--80agbgp3aafdnsm0c.xn--p1ai/system/library/partner.php on line 44 ]  Нужно адаптировать код по примеру [$q = 'select id, fio from `users`';
      $res = mysql_query($q);
      while (($row = mysql_fetch_assoc($res)) !== false) {
      // Преобразуем fio из utf-8/latin1 в windows-1251
      $s = iconv('utf-8', 'windows-1251', $row['fio']);
      // Преобразуем строку из однобайтной кодировки обратно в utf-8, выдав её за windows-1251
      $s = iconv('windows-1251', 'utf-8', $s);
      // Сохраняем назад в БД
      $q = 'update `users` set fio = "'.addslashes($s).'" where id = '.$row['id'];
      mysql_query($q);
      }]. Файл для работы прилагаю
      partner.php
    • By Only091
      Помогите пожалуйста, не получается сделать постраничную навигацию. Делал все по урокам. в Итоге получилось сделать два разных каталога один с фильтрами другой с постраничной навигацией. И теперь я пытаюсь объединить два каталога. Но не получается. Сами файлы урока в архике каталог. Буду очень благодарен если мне помогут! catalog.phpcatalogDB.js
      каталог.7z
    • By seoww
      Доброго времени суток. Я не сильно знающий веб-разработчик, но учусь. Начал создавать интернет магазин. Написал код самого сайта, посмотрел видео как делаются интернет-магазины и теперь не могу разобраться с PhpMyAdmin. Я не понимаю как она взаимодействует с сайтом. В интернете погуглил, так ничего дельного найти и не смог. Помогите пожалуйста.
      P.S сильно в меня камни не кидайте, я только учусь 
      Всем добра!
    • By Full-R
      Рекомендую выгодный хостинг Sprinthost, который поддерживает все версии PHP и Node.js.
      Производительность достаточная и есть возможность докупать процессные сервера. Например, для запуска ресурсоемких скриптов, которые садят сервер задницей в лужу для всех пользователей пока процесс кубаторит.
      Sprinthost.ru
      Цены спиртхоста уравновешенные, а качество обслуживания все таки повыше чем у конкурентов. Самый дешевый хостинг обходится в 118 рублей в месяц.
      Не банят при единоразовых всплесках нагрузки и дают ресурсов вплоть до потолка сервера на 1-2 часа без переплат.
      Можно регистрировать домены через reg.ru и по ночам отхватывать вкусные домены без переплат(я пол часа назад отхватил домен из 4х букв в зоне net за 1000 рублей).
      На серверах стоит Redhat или CentOS.
      Также дают бесплатные сертификаты SSL Let's Encrypt.
      Бэкап каждый день.
      Панель управления хостингом своя и очень удобная. Нет ни каких голимых запутанных опций.
    • By tor243
      Имеется таблица table с полями id, refpost, type и comment. Тип поля comment TEXT.
      Необходимо получит строки, где refpost у которой type='A' или type='D', который встречается в поле comment.
      Пробовал так:
      SELECT id, refpost, type, comment FROM table WHERE comment LIKE ( SELECT refpost FROM table WHERE type='A' OR type='D' ) Без результатов. Выдает ошибку 1242: Subquery returns more than 1 row
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy