как создать триггер для подсчета всех элементов, связанных с лагерем - PullRequest
0 голосов
/ 01 мая 2020

хорошо, позвольте мне объяснить, у меня есть 2 таблицы city

city_id      name         
1            city1        
2            city2 
3            city3
4            city4
5            city5

аптека

   pharm_id      name      fk_city_id
       1          pharm1        1
       2          pharm2        2
       3          pharm3        3
       4          pharm4        3
       5          pharm5        4

Мне нужен триггер для добавления вычисляемого столбца в городе, который отображает количество аптек, связанных с недавно в этом городе я сделал вид:

create view pharm_amount as (SELECT city.name, COUNT(*) FROM city INNER JOIN pharmacy ON city.city_id = pharmacy.fk_city_id GROUP BY city.name)

и получил этот

 name       quantity
   city1         1
   city2         1
   city3         2
   city4         1

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

city_id      name      quantity       
1            city1        1
2            city2        1
3            city3        2
4            city4        1

моя попытка триггера:

DELIMITER $$
 CREATE TRIGGER `trigger1`
 BEFORE INSERT ON `pharmacy` FOR EACH ROW BEGIN
SELECT city.name, COUNT(*) FROM city INNER JOIN pharmacy ON city.city_id = pharmacy.fk_city_id GROUP BY city.name
END $$
DELIMITER ;

Код ошибки: 1415 Не разрешается возвращать набор результатов из триггера

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

Сначала вам нужен столбец для количественного показателя в таблице вашего города.

ALTER TABLE city add column quantity integer DEFAULT NULL;

Этот триггер получает счетчик и вставляет его в новую строку.

DELIMITER $$
 CREATE TRIGGER `trigger1`
 BEFORE INSERT ON `pharmacy` FOR EACH ROW BEGIN
   SET NEW.quantity  = (SELECT COUNT(*) FROM city c INNER JOIN pharmacy p ON c.city_id = p.fk_city_id WHERE c.name = NEW.name GROUP BY city.name);
END $$
DELIMITER ;

РЕДАКТИРОВАТЬ следует также есть ПОСЛЕ INSER TRIGGER для аптек, поэтому при появлении новой аптеки она может обновлять таблицу городов

EDIT2

Вы также можете использовать функцию для этого

CREATE DEFINER=`root`@`localhost` FUNCTION `func_get_nopahr`(city_name  TEXT) RETURNS int
    DETERMINISTIC
BEGIN
SET @city = city_name;
RETURN (SELECT COUNT(*) FROM city c INNER JOIN pharmacy p ON c.city_id = p.fk_city_id WHERE c.name = @city GROUP BY c.name);
END

И вы можете назвать это так

SELECT func_get_nopahr('ac');
0 голосов
/ 01 мая 2020

Вы используете select, когда хотите update свою таблицу.

DELIMITER $$
 CREATE TRIGGER `trigger1`
 BEFORE INSERT ON `pharmacy` FOR EACH ROW 
BEGIN
  # Here's your problem:
  SELECT city.name, COUNT(*) FROM city INNER JOIN pharmacy ON city.city_id = pharmacy.fk_city_id GROUP BY city.name
END $$
DELIMITER ;

Вместо SELECT ... вам необходим запрос на обновление таблицы.

Что-то вроде update city set quantity = (select count(1) from pharmacy where pharmacy.fk_city_id = city.city_id) должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...