Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Триггер на изменение значения поля при добавлении записи в другую таблицу MySQL

Работаю в phpMyAdmin

Ребят, такая проблема. Не понимаю в чем дело, т.к. я чайник в MySQL.

В общем, мне нужно изменить значение в столбце `Количество книг` в таблице `книги`, когда в таблицу `продажа` добавляется новая запись о продаже - сделать все с помощью ТРИГГЕРА


CREATE TABLE IF NOT EXISTS `книги` (
`Автор` varchar(100) NOT NULL,
`Название` varchar(100) NOT NULL,
`Год издания` date NOT NULL,
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Издательство` varchar(100) NOT NULL,
`Количество книг` int(11) NOT NULL,
`Цена` int(11) NOT NULL,
PRIMARY KEY (`ID`),

) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

INSERT INTO `книги` (`Автор`, `Название`, `Год издания`, `ID`, `Издательство`, `Количество книг`, `Цена`) VALUES('Феоктистов Леонид', 'Большая энциклопедия астрономии', '2009-01-01', 2, 'Росмэн-Пресс', 10, 310);
INSERT INTO `книги` (`Автор`, `Название`, `Год издания`, `ID`, `Издательство`, `Количество книг`, `Цена`) VALUES('Иар Эльтеррус', 'Отзвуки серебряного ветра Мы - будем', '2009-01-01', 3, 'Альфа - книга', 10, 735);
INSERT INTO `книги` (`Автор`, `Название`, `Год издания`, `ID`, `Издательство`, `Количество книг`, `Цена`) VALUES('Лев Николаевич Толстой', 'Война и мир', '1996-01-01', 4, 'Лексика', 10, 1300);
INSERT INTO `книги` (`Автор`, `Название`, `Год издания`, `ID`, `Издательство`, `Количество книг`, `Цена`) VALUES('Михаил Афанасьевич Булгаков', 'Мастер и Маргарита', '2009-01-01', 5, 'АСТ', 10, 185);


CREATE TABLE IF NOT EXISTS `продажа` (
`КнигиID` int(11) NOT NULL,
`ПродавцыНомер трудовой книги` int(11) NOT NULL,
`Дата продажи` date NOT NULL,
`Номер сделки` int(11) NOT NULL AUTO_INCREMENT,
`Сумма` int(11) NOT NULL,
PRIMARY KEY (`Номер сделки`),
KEY `КнигиID` (`КнигиID`),
KEY `ПродавцыНомер трудовой книги` (`ПродавцыНомер трудовой книги`),

) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

INSERT INTO `продажа` (`КнигиID`, `ПродавцыНомер трудовой книги`, `Дата продажи`, `Номер сделки`) VALUES(3, 70113047, '2016-01-01', '');

DELIMITER |
CREATE TRIGGER `update_knigi` AFTER INSERT ON `manual1`.`продажа`
FOR EACH ROW
BEGIN
UPDATE `manual1`.`книги`
SET `Количество книг` = (`Количество книг` - 1)
WHERE `книги`.`ID` = `продажа`.`КнигиID`;
END;

----если делаю так, что при добавлении записи в таблицу `продажа` пишет ошибку "#1054 - Unknown column 'продажа.КнигиID' in 'where clause'"

-----
DELIMITER |
CREATE TRIGGER `update_knigi` AFTER INSERT ON `manual1`.`продажа`
FOR EACH ROW
BEGIN
UPDATE `manual1`.`книги`
SET `Количество книг` = (`Количество книг` - 1)
WHERE `книги`.`ID`;
END;

----если так, то значения отнимаются у всех значений `Количество книг`.

Не знаю что делать, пожалуйста, помогите :с
Ответ: Зачем так много лишней информации? Вопрос изложен понятно.
В триггере befor_insert таблицы продажа выполнить запрос:
UPDATE таблица_книги SET количество_книг = количество_книг - NEW.количество_проданных_книг WHERE таблица_книги.код_книги = NEW.код_книги
Вопрос: Репликация MySQL master-slave. Не реплицируется одно поле после его добавления

Доброго времени суток. Прошу помощи, ситуация такова:

Есть два сервера один master другой slave. Настроена репликация одной базы данных (назовем ее test).
Необходимо было добавить одно поле в одну из таблиц (назовем ее user) этой базы данных.
На master добавил необходимое поле (последним, с нулевым значением). Поле называется last_auth
Проверил на slave поле тоже добавилось. все ОК.
Далее. Новое поле должно заполняться пользователем с минимальными привилегиями.
Добавил:
create user 'lastauth'@'localhost' identified by 'мой пароль';
GRANT UPDATE (last_auth) ON test.user to 'lastauth'@'localhost';
GRANT SELECT (username) ON test.user to 'lastauth'@'localhost';

Проверяю на master (от пользователя lastauth):
UPDATE test.user SET last_auth = now() WHERE username='test_user';

Созданное поле из дефолтного значения изменилось на текущее.

НО на slave изменения не перетекли, там это поле есть (создание поля реплицировалось), но значение у этого пользователя test_user (да и вообще у всех) дефолтное.
такой же пользователь lastauth есть и на slave.
и репликация всей БД (за исключением этого поля) работает без ошибок.

В бинарном логе на master SQL запросов от созданного пользователя нету... Куда смотреть дальше не могу ничего найти...
Ответ:
testarchive
может кому будет полезно:
binlog-do-db

Вот раз 15 уже обсуждалось на форуме и с неизменно одинаковыми причинами. Даже отвечать было лень.
В книжках типа High Performance MySQL на этот момент значительный акцент сделан. Не, блин, мы будем читать только Хабрахабр.
Вопрос: Изменение значения столбца если в child таблице существуют записи, которые удовлетворяют условие

Всем привет.
Допустим у меня эсть 2 таблицы: Игра и Прокат. В таблице Прокат эсть дата начала проката и дата возврата(конца проката некой игры). В таблице Игра эсть поле В_ПРОКАТЕ_ЛИ_В_ДАННЫЙ_МОМЕНТ(bool). Как сделать, чтобы это поле было TRUE, эсли сегодняшняя дата между датой начала и конца проката, и эсли сейчас нет игры в прокате, то это поле должно быть FALSE. Проверку я сделал, но как менять значение самого поля В_ПРОКАТЕ_ЛИ_В_ДАННЫЙ_МОМЕНТ?

Код MySQL
1
2
3
...where 
now() between t1.date_of_issue and t1.real_return_date
...
Спасибо.
Ответ: Вононочо, тады
Код MySQL
1
2
UPDATE game
SET game.is_rent_now = ((SELECT COUNT(*) FROM rent WHERE game.id = rent.game_id AND NOW() BETWEEN rent.date_of_issue AND rent.real_return_date) > 0)
P.S. хочу дум 4й в прокат
Вопрос: Как скопировать строки таблицы с ручным изменением значения одного из полей

Помогите друзья!
Решается вопрос об увольнении, если не сделаю, а я не специалист.

В общем, с базами данных и мускулом в частности я не дружу вообще, не сталкивался ввиду своего образования и опыта.
Короче, начальник навязал мне срочное заполнение базы данных, необходимой для работы фильтра автомобильного сайта. Фильтр - обычные связанные списки: год выпуска - марка авто - модель.
На каждый год - около 30 марок, а на каждую марку - около 10-30 моделей.
Я искал инфу в нете, но в виду отсутствия опыта, найденным воспользоваться не смог.

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

То есть, строки должны скопироваться и быть точно такими же, только год стоять другой (есть соответствующее поле в таблице).

Пример кода дампа базы данных :
SQL
1
2
3
4
5
6
7
8
9
10
11
NSERT INTO `city` (`table_id`, `year_id`, `make_id`, `name`, `low`, `high`, `fog`) VALUES
(15789528, 16, 15790076, 'Z 440 sno pro', '881', '881', ''),
(15789527, 16, 15790075, 'Sl1000 falco', 'h7', 'h7', ''),
(15789529, 16, 15790076, 'Zl 580', '880', '881', ''),
(15789530, 16, 15790076, 'Zl 700', '880', '881', ''),
(15789531, 16, 15790706, 'Br250/t bravo', 'h4', 'h4', ''),
(15789533, 16, 15790706, 'Cs340/e ovation', 'h4', 'h4', ''),
(15789534, 16, 15790706, 'M600 mountain max', 'h4', 'h4', ''),
(15789535, 16, 15790706, 'Phazer', 'h4', 'h4', ''),
(15789536, 16, 15790706, 'Srx700', 'h4', 'h4', ''),
...
Мне нужно, чтобы все забитые данные скопировались, только значение 'year_ID' отличались и были указанными мною.
Если сегодня не сделаю к 10 вечера - то с работой можно прощаться. А у меня жена и двое детей и работы в городе нет.

Пожалуйста, дайте sql - запрос, который может выполнить эту задачу.
В инете искал, но поскольку языка запросов мускула не знаю вообще, и разбираться сроки до дедлайна не позволяют, то в найденном ничего понять не смог.
Заранее спасибо за помощь.
Не дайте двум детям остаться голодными...
Ответ: Детишки голодные это плохо.сколько строк в таблице?можно сделать запрос на update где изменения делать для указанных годов.
На сколько я понял,есть к примеру 1000 авто.нужно заменить год для всех 1000 или выборочно для сотни один год,для других другие?

Добавлено через 5 минут
PHP
1
UPDATE city SET year_id = год который нужен WHERE table_id = пишите идентификатор таблицы,первоя поле где много цифер ;
Вопрос: Обратный расчет суммы при изменении значения в поле на " "

Добрый день! Подскажите пожалуйста, как в поле получить сумму нескольких полей при изменении значения на = " ".
Если подробнее, то в поле [Итог] выводится суммированное значение методом сложения нескольких полей в столбцах

Visual Basic
1
2
3
Private Sub Ctl01_AfterUpdate()
Me.Итог = Me.Ctl01 + Nz((Me.Ctl02), 0) + Nz((Me.Ctl03), 0) + Nz((Me.Ctl04), 0) + Nz((Me.Ctl05), 0) + Nz((Me.Ctl06), 0)
End Sub
Все работает замечательно, пока в поля подставляются значения от 0 и до..... Стоит только в каком то из полей убрать значение оставив поле пустым, перестает считать.
Пробовал на потерю фокуса ставить проверку на каждое поле, например

Visual Basic
1
2
3
Private Sub Ctl01_LostFocus()
  If Me.Ctl01 = ""  Then
    Me.Итог = Nz((Me.Ctl02), 0) + Nz((Me.Ctl03), 0) + Nz((Me.Ctl04), 0) + Nz((Me.Ctl05), 0) + Nz((Me.Ctl06), 0)
Не работает, чего не так делаю? подскажите пожалуйста. Спасибо
Ответ:
Сообщение от texnik-san
сочувствую
Это было очень давно, кажется 3-й или 5-й раз как раз смотрели фильму по телеку - "Спортлото 82", да и мандаринов жалко, лучше бы сам сьел.
Вопрос: Изменить значения таблицы mysql

Всем привет. Есть таблицы v8ubv_virtuemart_products(id,virtuemart_product_id,product_sku..) и v8ubv_virtuemart_product_prices(id,virtuemart_product_id,product_price..) мне нужно зная только значение product_sku изменить соответствующее значение product_price.

Вот что написал я но что то не работает

автор
UPDATE v8ubv_virtuemart_product_prices as t3
SET t3.product_price = 1440
WHERE t3.virtuemart_product_id IN (
SELECT t2.virtuemart_product_id
FROM v8ubv_virtuemart_product_prices as t2 INNER JOIN v8ubv_virtuemart_products as t1
ON t2.virtuemart_product_id=t1.virtuemart_product_id
WHERE product_sku = 37431
);


Выдает ошибку Kernel error: Error( 1093 ) HY000: "You can't specify target table 't3' for update in FROM clause"
Ответ: используйте вложенный запрос или многотабличный update, см примеры
Вопрос: Получить количество пиков (изменений значений)

Здравствуйте!
Есть база, есть система, которая каждые 10 секунд записывает в базу значения, полученные с сотен датчиков. С базы, например, потом можно взять значения и построить график изменения состояний.
Один из датчиков стоит на устройстве и когда это устройство поднимается в вехнее положение, в базу каждые 10 секунд пишется 1, когда не находится в этом положении - пишется 0.
Подскажите, как мне посчитать, сколько раз устройство поднималось в своё верхнее положение?
Я так подозреваю, что как-то можно посчитать количество изменений значений, идущих подряд и разделить на 2, но не знаю как это сделать.
Если совсем упростить, то таблица будет состоять из 2 столбцов "датавремя" и "значение".
Благодарю за внимание!
Ответ:
Сообщение от body90
нужно будет вставить сюда условие, чтоб подсчитывалось за нужный период времени
и без гугла понятно, что здесь
... FROM T WHERE ...
Вопрос: Как вытащить значение поля в запросе INSERT

Привет всем!
Изучаю триггеры, есть запрос
MySQL
1
insert into tovar(kol_na_sklade) values ('233');
Есть триггер:

MySQL
1
2
3
4
5
6
7
8
CREATE TRIGGER `kolichestvo` AFTER UPDATE ON `tovar`
 FOR EACH ROW begin
DECLARE kol int(9) DEFAULT '0';
DECLARE kol_sklad int(9) DEFAULT '0';
set kol=(тут мне нужно выдрать из запроса вводимое число);
set kol_sklad= (тут нужно выдрать значение количества товара в таблице);
--далее пойдут различные извращения
end
Добавлено через 11 минут
Как в триггере вставить значения из запроса, в данном случае values ('233');
и как вставить значение количества товара из таблицы?
Ответ: Не понял. Делаешь INSERT, а рассматриваешь триггер на UPDATE.
Вопрос: Как правильно написать триггер instead of update?

Есть представление на две таблицы:
create table a (a_num number, a_dat date, a_var varchar2(30));
create table b (b_num number, b_dat date, b_var varchar2(30));

create or replace view ab (num, dat, var) as
  select * from a
  union all
  select * from b;

Написал триггер INSTEAD OF UPDATE
CREATE OR REPLACE TRIGGER ab_upd_trg
  INSTEAD OF UPDATE ON ab
  FOR EACH ROW
BEGIN
  update a set a_dat=:new.dat, a_var=:new.var where a_num=:old.num;
  update b set b_dat=:new.dat, b_var=:new.var where b_num=:old.num;
END;
/

Но при таком триггере у меня будут при изменении одного поля обновляться все поля, это лишняя нагрузка на базу (например если это не два поля, а десяток).
Есть вариант написать триггеры на каждое поле по отдельности - а более красивого решения нет?
Кто-нибудь делал такое?
Ответ: Не выходит с триггерами на каждое поле:
INSTEAD OF UPDATE OF num ON ab
                  *
ORA-04073: column list not valid for this trigger type

Значит один триггер с обновлениями всех полей (или dynamic sql прикрутить)?
Вопрос: Триггер обновляющий соответствующее поле в связанной таблице

Немного запутался в синтаксисе. Есть две таблицы со связью один ко многим. Мне нужно, чтобы при изменении поля в одной таблице соответствующее поле в другой заполнялось новой датой. Сваял вот это:
SQL
1
2
3
4
5
6
7
CREATE TRIGGER [dbo].[UpdatePhone]
    ON [dbo].[Telephones]
    FOR INSERT, UPDATE
    AS
    BEGIN
        UPDATE [dbo].[Contacts] SET [dbo].[Contacts].date_creation = GETDATE() WHERE [dbo].[Contacts].Id = [dbo].[Telephones].id_c
    END
Выдает предупреждение SQL71502 с довольно странным описанием, что, мол есть неразрешенная ссылка на объект [dbo].[Contacts].[dbo]
Ответ: Во-первых, это ваше счастье, что сервер ругнулся и не стал апдейтить всю таблицу [dbo].[Contacts].
У вас сегодня второй день рождения, я считаю

Во-вторых, откуда там в UPDATE вдруг появилась вторая таблица [dbo].[Telephones]?
Таблицы могут появляться только во FROM или в MERGE.

В-третьих, вы что-нибудь знаете о псевдотаблицах inserted и deleted?
Надо всего лишь почитать в документации о триггере и UPDATE.