powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / ERROR 1242 (21000) при insert
14 сообщений из 14, страница 1 из 1
ERROR 1242 (21000) при insert
    #39158040
drunja
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер всем!
Есть три таблицы 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
ERROR 1242 (21000) при insert
    #39158045
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drunja
Код: sql
1.
where NEW.day_id

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

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


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

В каком смысле "нельзя" и что на самом деле нужно получить?
...
Рейтинг: 0 / 0
ERROR 1242 (21000) при insert
    #39158058
drunja
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
ERROR 1242 (21000) при insert
    #39158116
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
выполните эти запросы
Код: sql
1.
2.
3.
select razmer_premii from everyday where day_id = 1

select oklad from rabotniki where man_id = 1

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

select oklad from rabotniki where man_id = 1

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

одну запись возвращают.
...
Рейтинг: 0 / 0
ERROR 1242 (21000) при insert
    #39158861
Фотография 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;
...
Рейтинг: 0 / 0
ERROR 1242 (21000) при insert
    #39158946
drunja
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
ERROR 1242 (21000) при insert
    #39158968
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так что разбираться... посмотрите запрос1 в паре
1. select razmer_premii from everyday where NEW.day_id
2. select oklad from rabotniki where man_id = NEW.day_id
...
Рейтинг: 0 / 0
ERROR 1242 (21000) при insert
    #39158970
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
копировал с вашего первого варианта
...
Рейтинг: 0 / 0
ERROR 1242 (21000) при insert
    #39158973
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drunja,

Может, Вы таки опишете желаемое, что вы хотите получить от этого, мягко говоря, странного триггера ?
Странного потому, что пытается читать из той же таблицы, при вставке в которую вызывается.
...
Рейтинг: 0 / 0
ERROR 1242 (21000) при insert
    #39158994
drunja
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
ERROR 1242 (21000) при insert
    #39159007
drunja
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
14 сообщений из 14, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / ERROR 1242 (21000) при insert
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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