SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 22.05.2008 22:38:00

Predator
Участник
Зарегистрирован: 21.05.2008
Сообщений: 23

создание таблиц

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

Неактивен

 

#2 22.05.2008 23:04:27

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: создание таблиц

Можно создать таблицу, а затем создать представление VIEW, которое будет содержать рассчитываемые столбцы

Неактивен

 

#3 23.05.2008 11:08:55

Predator
Участник
Зарегистрирован: 21.05.2008
Сообщений: 23

Re: создание таблиц

а реально ли это сделаать через триггер? триггер мне все-равно надо писать, целых 2 штуки!

Неактивен

 

#4 23.05.2008 12:01:50

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

Re: создание таблиц

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

Неактивен

 

#5 23.05.2008 13:06:55

Predator
Участник
Зарегистрирован: 21.05.2008
Сообщений: 23

Re: создание таблиц

Это очень хорошо. именно так и надо))

Неактивен

 

#6 23.05.2008 14:11:40

Predator
Участник
Зарегистрирован: 21.05.2008
Сообщений: 23

Re: создание таблиц

я написала:
DROP TRIGGER IF exists trig1;
#delimiter $$
CREATE TRIGGER trig1
AFTER INSERT ON orders
FOR EACH ROW
update orders set itogo= (select ocenka.price +(more.nacenka*ocenka.price/100) as total from ocenka, more, orders where orders.days = more.days
and orders.ocenkaid=ocenka.ocenkaid order by orderid)
where orderid=mew.orderid;



#Delimiter ;



а он ругнулся:

ERROR 1442 (HY000): Can't update table 'orders' in stored function/trigger because it is already used by statement which invoked this stored function/trigg

Неактивен

 

#7 23.05.2008 14:42:54

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

Re: создание таблиц

Посиотрите тему про блокировки
http://sqlinfo.ru/forum/viewtopic.php?pid=4096#p4096

Естественно, в Вашем случае нельзя выполнить update таблицы orders в триггере, т.к. таблица уже заблокирована выражением, вызвавшем триггер.

Неактивен

 

#8 23.05.2008 15:38:21

Predator
Участник
Зарегистрирован: 21.05.2008
Сообщений: 23

Re: создание таблиц

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

Неактивен

 

#9 23.05.2008 15:45:02

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

Re: создание таблиц


CREATE TRIGGER trig1
BEFORE INSERT ON orders
FOR EACH ROW
set new.itogo= (SELECT ...);
 

Неактивен

 

#10 23.05.2008 15:52:05

Predator
Участник
Зарегистрирован: 21.05.2008
Сообщений: 23

Re: создание таблиц

ой! сильно стал ругаться

Неактивен

 

#11 23.05.2008 15:59:01

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

Re: создание таблиц

А что пишет?

Неактивен

 

#12 23.05.2008 16:03:01

Predator
Участник
Зарегистрирован: 21.05.2008
Сообщений: 23

Re: создание таблиц

mysql> \. tr1.sql
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '
;
CREATE TRIGGER trig1
before INSERT ON orders
FOR EACH ROW
set new.itogo= (sele' at line 1
mysql> \. tr2.sql
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '
;

Неактивен

 

#13 23.05.2008 16:22:50

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

Re: создание таблиц

У Вас наверное запрос в скобках заканчивается ";"
Если не это, то приведите полностью команду, которой создается триггер.

Неактивен

 

#14 23.05.2008 16:33:28

Predator
Участник
Зарегистрирован: 21.05.2008
Сообщений: 23

Re: создание таблиц

теперь выдает вот так:

mysql> \. tr1.sql
Query OK, 0 rows affected, 1 warning (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO  orders VALUES (Null, 12, '2008.10.10', 2, 5, 2500, 1);
ERROR 1242 (21000): Subquery returns more than 1 row
mysql> INSERT INTO  orders VALUES (Null, 12, '2008.10.10', 2, 5, 2500, 1);
ERROR 1242 (21000): Subquery returns more than 1 row
mysql>




DROP TRIGGER IF exists trig1;
CREATE TRIGGER trig1
before INSERT ON orders
FOR EACH ROW
set new.itogo= (select ocenka.price +(more.nacenka*ocenka.price/100) as total from ocenka, more, orders where orders.days = more.days
and orders.ocenkaid=ocenka.ocenkaid order by orderid);

Неактивен

 

#15 23.05.2008 16:38:56

Predator
Участник
Зарегистрирован: 21.05.2008
Сообщений: 23

Re: создание таблиц

я так поняла ошибка в том, что селект выводит много строчек, а надо, чтобы одну

Неактивен

 

#16 23.05.2008 16:39:16

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

Re: создание таблиц

Ну так это понятно. Сколько результатов выдает Ваш подзапрос?


elect ocenka.price +(more.nacenka*ocenka.price/100) as total from ocenka, more, orders where orders.days = more.days
and orders.ocenkaid=ocenka.ocenkaid order by orderid
 

А нужен понятное дело один (1строкаx1столбец).

Неактивен

 

#17 23.05.2008 16:52:15

Predator
Участник
Зарегистрирован: 21.05.2008
Сообщений: 23

Re: создание таблиц

сделала вот так:
DROP TRIGGER IF exists trig1;
CREATE TRIGGER trig1
before INSERT ON orders
FOR EACH ROW
set new.itogo= (select ocenka.price +(more.nacenka*ocenka.price/100) as total from ocenka, more, orders where orders.days = more.days
and orders.ocenkaid=ocenka.ocenkaid and orderid=new.orderid);

добавлять добавляет, не ругается, но в поле itogo пишет  NULL. hmm

Неактивен

 

#18 23.05.2008 17:01:34

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

Re: создание таблиц

orderid=new.orderid
Чему по Вашему равен new.orderid?
Это и есть NULL.
Т.е. у Вас условие orderid=NULL.
Результат подзапроса, как следствие, тоже NULL

Неактивен

 

#19 23.05.2008 21:02:08

Predator
Участник
Зарегистрирован: 21.05.2008
Сообщений: 23

Re: создание таблиц

я попыталась переделать на AFTER, но опять не получилось!!!!! как же делается этот триггер???

Неактивен

 

#20 23.05.2008 22:35:07

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

Re: создание таблиц

Всё что Вам осталось сделать это написать подзапрос, который на основании данных из других таблиц рассчитает значение поля itogo.

Данные Вы добавляете командой:

mysql> INSERT INTO  orders VALUES (Null, 12, '2008.10.10', 2, 5, 2500, 1);
ERROR 1242 (21000): Subquery returns more than 1 row


Обратите внимание, значение поля orderid Вы не указываете явно, поэтому на этапе выполнения триггера new.orderid=NULL
Зато известны другие данные new.ocenkaid, new.days и т.д.

Написать запрсос за Вас не могу, так как не знаю структуры, данных и замысла создателя. Не исключено, что в существующей логике и нельзя получить желаемый результат.
Напишите SELECT, который на основании тех данных, что используются в INSERT, рассчитает нужное значение itogo.

Неактивен

 

Board footer

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