SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 31.01.2012 15:30:29

Gil
Участник
Зарегистрирован: 31.01.2012
Сообщений: 4

Триггер работающий с несколькими таблицами

Доброго времени суток, имеется проблема с созданием триггера, есть 2 таблички

CREATE TABLE IF NOT EXISTS `vendor` (
`vendor_name` CHAR(50),
`vendor_address` CHAR(80),
PRIMARY KEY(`vendor_name`)
) CHARACTER SET=UTF8 ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `property` (
`p_id` INT NOT NULL,
`name` CHAR(80),
`vendor_name` CHAR(50),
`color` CHAR(30),
PRIMARY KEY(`p_id`),
FOREIGN KEY (vendor_name) REFERENCES vendor(vendor_name) ON DELETE CASCADE
) CHARACTER SET=UTF8 ENGINE=InnoDB;

с некоторыми данными соответсвенно Производители и Свойства товара

необходимо отсекать товары произведенный в, допустим, "СПб" при вводе товара в таблицу Свойства товара

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

DELIMITER $$

CREATE TRIGGER p_ins
BEFORE INSERT ON property FOR EACH ROW
BEGIN

IF NEW.vendor_name = (SELECT vendor.vendor_name FROM vendor WHERE vendor.vendor_address = 'Saint-Petersburg')
THEN
insert into `Saint-Petersburg` values(5);
END IF;

END

заранее спасибо.

P.S. "insert into `Saint-Petersburg` values(5);" таблицы `Saint-Petersburg` не существет, это для отмены создания

Отредактированно Gil (31.01.2012 15:31:44)

Неактивен

 

#2 31.01.2012 16:58:10

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Триггер работающий с несколькими таблицами

Gil написал:

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

А разве такая ситуация не приводит к ошибке (что вам и требуется)?

Неактивен

 

#3 31.01.2012 17:02:28

Gil
Участник
Зарегистрирован: 31.01.2012
Сообщений: 4

Re: Триггер работающий с несколькими таблицами

vasya написал:

Gil написал:

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

А разве такая ситуация не приводит к ошибке (что вам и требуется)?

Да, но если допустим в таблице свойств уже есть товар, который произведен в СПб, с двумя строчками производителя СПб не добавляются никакие значения, т.к. сразу же выводится ошибка - Subquery returns more than 1 row

Отредактированно Gil (31.01.2012 17:14:03)

Неактивен

 

#4 31.01.2012 17:11:17

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Триггер работающий с несколькими таблицами

И что? Вы хотите также удалить и ранее введенные товары?

Неактивен

 

#5 31.01.2012 17:16:36

Gil
Участник
Зарегистрирован: 31.01.2012
Сообщений: 4

Re: Триггер работающий с несколькими таблицами

vasya написал:

И что? Вы хотите также удалить и ранее введенные товары?

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

Отредактированно Gil (31.01.2012 17:17:25)

Неактивен

 

#6 31.01.2012 17:19:54

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Триггер работающий с несколькими таблицами

SELECT vendor.vendor_name FROM vendor WHERE vendor.vendor_address = 'Saint-Petersburg' limit 1

Неактивен

 

#7 31.01.2012 17:30:16

Gil
Участник
Зарегистрирован: 31.01.2012
Сообщений: 4

Re: Триггер работающий с несколькими таблицами

Спасибо, проблема решена, сработала конструкция

IF NEW.vendor_name IN (SELECT vendor.vendor_name FROM vendor WHERE vendor.vendor_address = 'Saint-Petersburg')

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson