Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / ERROR 1242 (21000) при insert / 14 сообщений из 14, страница 1 из 1
28.01.2016, 23:51:27
    #39158040
drunja
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ERROR 1242 (21000) при insert
Добрый вечер всем!
Есть три таблицы rabotniki, everyday, everymonth

В таблицу rabotniki вносятся данные о работниках,
в таблицу everyday вносятся данные о болезни и начисленная премия,
в таблицу everymonth вставляются данные триггером вставки в таб. everyday сумма столбцов rabotniki.oklad и everyday.razmer_premii
в столбец month_dohod при условии что если человек болен и не является членом профсоюза, то его month_dohod/2

Появляется ошибка
ERROR 1242 (21000): Subquery returns more than 1 row
при второй вставке в таблицу everyday (первую строку вставляет).
Помогите, пожалуйста, исправить код, нигде не нашёл решение ERROR 1242 при инсерте.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
CREATE TABLE rabotniki
(man_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
fname VARCHAR(20),
iname VARCHAR(20),
oname VARCHAR(20),
posada VARCHAR(20),
oklad SMALLINT UNSIGNED,
semya_deti VARCHAR(20),
chlen_profsouza ENUM('+'),
CONSTRAINT pk_rabotniki PRIMARY KEY (man_id)
);
Query OK, 0 rows affected (0.14 sec)

CREATE TABLE everyday
(day TIMESTAMP,
day_id SMALLINT UNSIGNED,
bolen ENUM('+'),
razmer_premii SMALLINT UNSIGNED,
CONSTRAINT fk_man_id FOREIGN KEY (day_id)
REFERENCES rabotniki (man_id)
);
Query OK, 0 rows affected (0.67 sec)

CREATE TABLE everymonth
(month_id SMALLINT UNSIGNED,
day TIMESTAMP,
month_dohod SMALLINT UNSIGNED,
CONSTRAINT fk_man_id2 FOREIGN KEY (month_id)
REFERENCES rabotniki (man_id)
);
Query OK, 0 rows affected (0.67 sec)

DELIMITER //
CREATE TRIGGER dohod 
AFTER INSERT ON everyday
FOR EACH ROW
BEGIN
IF new.bolen is not null and (select chlen_profsouza from rabotniki where man_id = NEW.day_id) is null then
INSERT INTO everymonth
(month_id, month_dohod) VALUES (NEW.day_id, (((select razmer_premii from everyday where NEW.day_id) + (select oklad from rabotniki where man_id = NEW.day_id))/2));
else
INSERT INTO everymonth
(month_id, month_dohod) VALUES (NEW.day_id, ((select razmer_premii from everyday where NEW.day_id) + (select oklad from rabotniki where man_id = NEW.day_id)));
END IF;
END;
//

INSERT INTO rabotniki
(fname, iname, oname, posada, oklad, semya_deti, chlen_profsouza) VALUES ('Волков', 'Валентин', 'Юрьевич', 'газосварщик', 2400, 'женат, детей нету', '+');
Query OK, 1 row affected (0.00 sec)

INSERT INTO rabotniki
(fname, iname, oname, posada, oklad, semya_deti) VALUES ('Хворост', 'Алексей', 'Сергеевич', 'водитель-каптёрщик', 1750, 'женат, детей есть');
Query OK, 1 row affected (0.00 sec)

INSERT INTO rabotniki
(fname, iname, oname, posada, oklad, semya_deti) VALUES ('Мельник', 'Вадим', 'Генадиевич', 'токарь', 1500, 'не женат, детей нету');
Query OK, 1 row affected (0.00 sec)

INSERT INTO everyday
(day_id, razmer_premii) VALUES (1, 200);
Query OK, 1 row affected (0.00 sec)

INSERT INTO everyday
(day_id, razmer_premii) VALUES (2, 300);
ERROR 1242 (21000): Subquery returns more than 1 row
...
Рейтинг: 0 / 0
29.01.2016, 00:00:39
    #39158045
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ERROR 1242 (21000) при insert
drunja
Код: sql
1.
where NEW.day_id

Вероятно, тут что-то пропущено.
...
Рейтинг: 0 / 0
29.01.2016, 00:25:26
    #39158050
drunja
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ERROR 1242 (21000) при insert
miksoftdrunja
Код: sql
1.
where NEW.day_id

Вероятно, тут что-то пропущено.
Сделал так
Код: sql
1.
where day_id = NEW.day_id


но теперь нельзя второй раз инсертить в таблицу everyday с тем же самым значением day_id
...
Рейтинг: 0 / 0
29.01.2016, 00:45:56
    #39158054
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ERROR 1242 (21000) при insert
drunja,

В каком смысле "нельзя" и что на самом деле нужно получить?
...
Рейтинг: 0 / 0
29.01.2016, 00:55:54
    #39158058
drunja
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ERROR 1242 (21000) при insert
miksoftdrunja,

В каком смысле "нельзя" и что на самом деле нужно получить?
Например, делаю запрос на вставку
Код: sql
1.
2.
3.
4.
mysql> INSERT INTO everyday
    -> (day_id, razmer_premii) VALUES (1, 200);
    -> //
Query OK, 1 row affected (0.08 sec)


делаю еще один запрос (в столбец day_id так же как и в прошлом запросе вставляю 1)
Код: sql
1.
2.
3.
4.
mysql> INSERT INTO everyday
    -> (day_id, bolen, razmer_premii) VALUES (1, '+', 150);
    -> //
ERROR 1242 (21000): Subquery returns more than 1 row
...
Рейтинг: 0 / 0
29.01.2016, 06:34:52
    #39158116
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ERROR 1242 (21000) при insert
выполните эти запросы
Код: sql
1.
2.
3.
select razmer_premii from everyday where day_id = 1

select oklad from rabotniki where man_id = 1

и посмотрите, сколько записей они возвращают.
...
Рейтинг: 0 / 0
29.01.2016, 16:39:44
    #39158714
drunja
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ERROR 1242 (21000) при insert
tanglirвыполните эти запросы
Код: sql
1.
2.
3.
select razmer_premii from everyday where day_id = 1

select oklad from rabotniki where man_id = 1

и посмотрите, сколько записей они возвращают.

одну запись возвращают.
...
Рейтинг: 0 / 0
29.01.2016, 18:10:04
    #39158861
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ERROR 1242 (21000) при insert
проверяйте что там у вас,
ошибка где-то, иного не дано
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
INSERT INTO everymonth
(month_id, month_dohod)
 VALUES 
(NEW.day_id, (((select razmer_premii from everyday where NEW.day_id) + (select oklad from rabotniki where man_id = NEW.day_id))/2)); /*4 закрыв скобки*/
else
INSERT INTO everymonth
(month_id, month_dohod) 
VALUES 
(NEW.day_id, ((select razmer_premii from everyday where NEW.day_id) + (select oklad from rabotniki where man_id = NEW.day_id))); /*3 закрыв скобки*/
END IF;
...
Рейтинг: 0 / 0
29.01.2016, 20:18:55
    #39158946
drunja
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ERROR 1242 (21000) при insert
Alex_Ustinovпроверяйте что там у вас,
ошибка где-то, иного не дано
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
INSERT INTO everymonth
(month_id, month_dohod)
 VALUES 
(NEW.day_id, (((select razmer_premii from everyday where NEW.day_id) + (select oklad from rabotniki where man_id = NEW.day_id))/2)); /*4 закрыв скобки*/
else
INSERT INTO everymonth
(month_id, month_dohod) 
VALUES 
(NEW.day_id, ((select razmer_premii from everyday where NEW.day_id) + (select oklad from rabotniki where man_id = NEW.day_id))); /*3 закрыв скобки*/
END IF;


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
DELIMITER //
CREATE TRIGGER dohod 
AFTER INSERT ON everyday
FOR EACH ROW
BEGIN
IF new.bolen is not null and (select chlen_profsouza from rabotniki where man_id = NEW.day_id) is null then
INSERT INTO everymonth
(month_id, month_dohod) VALUES (NEW.day_id, ((select razmer_premii from everyday where day_id = NEW.day_id) + (select oklad from rabotniki where man_id = NEW.day_id))/2);
else
INSERT INTO everymonth
(month_id, month_dohod) VALUES (NEW.day_id, ((select razmer_premii from everyday where day_id = NEW.day_id) + (select oklad from rabotniki where man_id = NEW.day_id)));
END IF;
END;
//


убрал одну пару скобок, но всё равно та же ошибка. Не могу разобраться что тут не так.
...
Рейтинг: 0 / 0
29.01.2016, 21:20:18
    #39158968
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ERROR 1242 (21000) при insert
так что разбираться... посмотрите запрос1 в паре
1. select razmer_premii from everyday where NEW.day_id
2. select oklad from rabotniki where man_id = NEW.day_id
...
Рейтинг: 0 / 0
29.01.2016, 21:21:48
    #39158970
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ERROR 1242 (21000) при insert
копировал с вашего первого варианта
...
Рейтинг: 0 / 0
29.01.2016, 21:24:09
    #39158973
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ERROR 1242 (21000) при insert
drunja,

Может, Вы таки опишете желаемое, что вы хотите получить от этого, мягко говоря, странного триггера ?
Странного потому, что пытается читать из той же таблицы, при вставке в которую вызывается.
...
Рейтинг: 0 / 0
29.01.2016, 22:13:33
    #39158994
drunja
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ERROR 1242 (21000) при insert
miksoft,

Вот оригинал задания:
авторРазработайте базу данных для автоматизации начисления заработной платы в бухгалтерии. Зарплата начисляется работникам, имеющим установленные оклады (сдельных работ нет), На каждого работника хранятся следующие данные:
- личный номер;
- Ф.И.О.;
- должность;
- оклад;
- семейное положение и число детей:
- данные о невыходе на работу по болезни (даты заболевания и выздоровления).
В период болезни работнику начисляется 50% зарплаты; 100% начисляется лишь членам профсоюза. Работникам могут начисляться премии и другие надбавки. С общей суммы зарплаты снимается подоходный налог 13 %.
База данных должна обеспечивать:
- ввод, изменение анкетных данных работников, сведения о болезнях, надбавках;
- ежемесячный перерасчет зарплаты с выдачей ведомости на экран и на печать.


Предположим
авторНа каждого работника хранятся следующие данные:
- личный номер;
- Ф.И.О.;
- должность;
- оклад;
- семейное положение и число детей:
- данные о невыходе на работу по болезни (даты заболевания и выздоровления).
это у нас будет таблица rabotniki тут всё понятно

авторВ период болезни работнику начисляется 50% зарплаты; 100% начисляется лишь членам профсоюза.
для этого я написал триггер который берет значение (chlen_profsouza) из таблицы rabotniki и значение bolen из таблицы everyday, проверяет на условие и вставляет в таблицу everymonth зарплату заработанную за день каждому работнику в зависимости от условия

авторРаботникам могут начисляться премии и другие надбавки.
Премию мы вставляем сами в таблицу everyday. это тоже понятно.

авторС общей суммы зарплаты снимается подоходный налог 13 %.
Это можно сделать запрос select на таблицу everymonth, в котором мы укажем month_id нужного нам работника, диапазон дат (в нашем случае последние 30 дней), а так же условие SUMM суммирование ежедневной зарплаты за 30 дней и вычитаем налог 13%
в итоге запрос на вывод месячной зарплаты определенного работника будет выглядеть так
Код: sql
1.
select SUMM(month_dohod) - SUMM(month_dohod*13/100) from everymonth where month_id = 1;


с этим тоже понятно
...
Рейтинг: 0 / 0
29.01.2016, 22:46:54
    #39159007
drunja
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ERROR 1242 (21000) при insert
Alex_Ustinov,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select razmer_premii from everyday where day_id = NEW.day_id;

(NEW.day_id, ((select razmer_premii from everyday where NEW.day_id = month_id) + (select oklad from rabotniki where man_id = NEW.day_id)));

select razmer_premii from everyday where day_id = NEW.day_id = day_id;



(NEW.day_id, ((select razmer_premii from everyday where NEW.day_id) + (select oklad from rabotniki where NEW.day_id)));



Все эти варианты пробовал, не получилось.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / ERROR 1242 (21000) при insert / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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