powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Insert or Update в хранимой процедуре
12 сообщений из 12, страница 1 из 1
Insert or Update в хранимой процедуре
    #38425993
Dozent
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброй ночи, пожалуйста прошу помочь разобратся, я немного не допонимаю как правильно написать...
есть таблица

Код: plsql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE `salary` (
  `id_sal` INT(11) NOT NULL AUTO_INCREMENT,
  `id_sotr` INT(11) NOT NULL COMMENT 'id сотрудника',
  `date_work` DATE DEFAULT NULL COMMENT 'Дата рабочего дня',
  `summa` DECIMAL(10,2) DEFAULT NULL COMMENT 'Сумма всех заказов',
  PRIMARY KEY (`id_sal`)
) ENGINE=INNODB DEFAULT CHARSET=cp1251



созданию хранимую процедуру параметрами которой будут id_sotr, date_work, summa

Код: plsql
1.
    PROCEDURE `hairsalon`.`salary_upendwork`(IN id INT(11),IN dates DATE,IN summ DECIMAL(10,2))



Мне нужно чтобы если за текущую дату нет записи с адишником сотрудника то она создалась если есть то изменить

Код: plsql
1.
UPDATE `hairsalon`.`salary`  SET `summa` = summ WHERE `id_sotr` = id AND `date_work` = dates;



Вот тут у меня загвоздка, почитал... Как я понял мне Replace не совсем подойдёт, т.к. он сначало удаляет имеющуюся запись а потом удаляет...

Нащёл вот такую штуку

авторmysql> INSERT INTO table (a,b,c) VALUES (1,2,3)
--> ON DUPLICATE KEY UPDATE c=c+1;
Если a определяется как UNIQUE и уже содержит 1, то тогда вышеуказанная команда будет аналогична следующей:
mysql> UPDATE table SET c=c+1 WHERE a=1;
Внимание: если столбец b также является уникальным ключем, то UPDATE переписывается как:
mysql> UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;

но не пойму как правильно написать запрос

Код: plsql
1.
INSERT INTO `hairsalon`.`salary` (id_sotr, date_work, summa) VALUES (id, dates, summ) ON DUPLICATE KEY UPDATE `summa` = summ



что то вроде этого, но как я понял чтобы всё правильно сработало мне надо поставить ключивыми полями дату и ади сотрудника так?

Подскажите как правильно сделать... Заранее спасибо
...
Рейтинг: 0 / 0
Insert or Update в хранимой процедуре
    #38426011
Dozent
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПОпробовал выполнят ьзапрос который написал

Код: plsql
1.
INSERT INTO `hairsalon`.`salary` (id_sotr, date_work, summa) VALUES (id, dates, summ) ON DUPLICATE KEY UPDATE `summa` = summ



сделал поле id_sotr уникальным, всё прекрасно, но дату не сделаешь уникальынм полем, ну он на неё не реагирует вобщем...
Как сделать можно хелп плз...
...
Рейтинг: 0 / 0
Insert or Update в хранимой процедуре
    #38426032
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dozentно дату не сделаешь уникальынм полема что мешает сделать
Код: sql
1.
alter table `salary` add unique (id_sotr, date_work)


и потом
Код: sql
1.
INSERT INTO `hairsalon`.`salary` (id_sotr, date_work, summa) VALUES (id, dates, summ) ON DUPLICATE KEY UPDATE `summa` = values(summa)
...
Рейтинг: 0 / 0
Insert or Update в хранимой процедуре
    #38426075
Dozent
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мда...
P.S. И только сейчас до него дошло, что вчера он всё делал верно...
Ну да я вчера так и седлал) у меня даже получилось как надо) а я это принял за не то как надо
...
Рейтинг: 0 / 0
Insert or Update в хранимой процедуре
    #38427457
Dozent
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К сожаления не получается:(
хранимка выполняет

Код: plsql
1.
	INSERT INTO `hairsalon`.`salary` (id_sotr, date_work, summa) VALUES (id, dates, summ) ON DUPLICATE KEY UPDATE `summa` = `summa`+ summa;



делаю вот такой запрос к примеру

Код: plsql
1.
CALL salary_upendwork(4, "2013-10-16", "125.54");


При этом добавлены поля id_sotr и date_work, должно как бы при смене даты заносить новую запись допустим с тем же ади сотр, но этого не просиходит он просто суммирует по сотруднику поле summa и всё, что можете посоветовать?
...
Рейтинг: 0 / 0
Insert or Update в хранимой процедуре
    #38427458
Dozent
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DozentПри этом добавлены поля id_sotr и date_work
вот что я иммел ввиду

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TABLE `salary` (
  `id_sal` INT(11) NOT NULL AUTO_INCREMENT,
  `id_sotr` INT(11) NOT NULL COMMENT 'id сотрудника',
  `date_work` DATE DEFAULT NULL COMMENT 'Дата рабочего дня',
  `summa` DECIMAL(10,2) DEFAULT NULL COMMENT 'Сумма всех заказов',
  PRIMARY KEY (`id_sal`),
  UNIQUE KEY `id_sotr` (`id_sotr`),
  UNIQUE KEY `date_work` (`date_work`)
) ENGINE=INNODB AUTO_INCREMENT=78 DEFAULT CHARSET=cp1251
...
Рейтинг: 0 / 0
Insert or Update в хранимой процедуре
    #38427467
Dozent
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жаль что пока ни кт оне может что нибудь посоветовать...
ПОка на ум приходит такой вариант

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
DELIMITER $$

USE `hairsalon`$$

DROP PROCEDURE IF EXISTS `salary_upendwork`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `salary_upendwork`(IN id INT(11),IN dates DATE,IN summ DECIMAL(10,2))
    COMMENT 'По завершению работы изменяем значения зарплаты'
BEGIN
	
	INSERT IGNORE INTO `hairsalon`.`salary` (id_sotr, date_work, summa) VALUES (id, dates, "0.00"); /* ON DUPLICATE KEY UPDATE `summa` = `summa`+ summ;*/
	UPDATE `hairsalon`.`salary`  SET `summa` = `summa`+ summ WHERE `id_sotr` = id AND `date_work` = dates;
	
    END$$

DELIMITER ;



Код: plsql
1.
CALL salary_upendwork(3, "2013-10-16", "100.00");



а при селекте уберать дублирующиеся записи.. ну хотя бы так он работает как мне нужно...

Прошу если кто знает как может подсказать правильное решение, подскажите...
...
Рейтинг: 0 / 0
Insert or Update в хранимой процедуре
    #38427471
Dozent
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всё решил
удалил из таблицы поле id_sal

Код: plsql
1.
2.
3.
4.
5.
6.
CREATE TABLE `salary` (
  `id_sotr` INT(11) NOT NULL COMMENT 'id сотрудника',
  `date_work` DATE NOT NULL COMMENT 'Дата рабочего дня',
  `summa` DECIMAL(10,2) DEFAULT NULL COMMENT 'Сумма всех заказов',
  PRIMARY KEY (`id_sotr`,`date_work`)
) ENGINE=INNODB DEFAULT CHARSET=cp1251



составным ключ будет сочиетание адисотр и даты ну и хранимка

Код: plsql
1.
2.
	INSERT IGNORE INTO `hairsalon`.`salary` (id_sotr, date_work, summa) VALUES (id, dates, "0.00");  
	UPDATE `hairsalon`.`salary`  SET `summa` = `summa`+ summ WHERE `id_sotr` = id AND `date_work` = dates;



всем спасибо)
...
Рейтинг: 0 / 0
Insert or Update в хранимой процедуре
    #38427495
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dozentвсё решил
удалил из таблицы поле id_salда уж, решил так решил
Dozent
Код: plsql
1.
ON DUPLICATE KEY UPDATE `summa` = `summa`+ summa;

ещё раз:
Код: plsql
1.
ON DUPLICATE KEY UPDATE `summa` = `summa`+ values(summa);
...
Рейтинг: 0 / 0
Insert or Update в хранимой процедуре
    #38428850
Dozent
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirDozentвсё решил
удалил из таблицы поле id_salда уж, решил так решил
Dozent
Код: plsql
1.
ON DUPLICATE KEY UPDATE `summa` = `summa`+ summa;

ещё раз:
Код: plsql
1.
ON DUPLICATE KEY UPDATE `summa` = `summa`+ values(summa);



мне не надо увеличивать текущее значение на само себя...
...
Рейтинг: 0 / 0
Insert or Update в хранимой процедуре
    #38428854
Dozent
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
DELIMITER $$

USE `hairsalon`$$

DROP PROCEDURE IF EXISTS `salary_upendwork`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `salary_upendwork`(IN id INT(11),IN dates DATE,IN summ DECIMAL(10,2))
    COMMENT 'По завершению работы изменяем значения зарплаты'
BEGIN
	
	INSERT IGNORE INTO `hairsalon`.`salary` (id_sotr, date_work, summa) VALUES (id, dates, "0.00");  
	UPDATE `hairsalon`.`salary`  SET `summa` = `summa`+ summ WHERE `id_sotr` = id AND `date_work` = dates;
	
    END$$

DELIMITER ;
...
Рейтинг: 0 / 0
Insert or Update в хранимой процедуре
    #38429068
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dozentмне не надо увеличивать текущее значение на само себя ...facepa~1.BMP
RTFM , особое внимание на абзац, начинающийся со слов "You can use the VALUES(col_name) function"
А если надо именно записать новое, а не прибавить новое к старому, то непонятно, чем вам не подошёл этот 14964477 вариант...
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Insert or Update в хранимой процедуре
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]