powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Странное поведение запроса в хранимой процедуре.
12 сообщений из 12, страница 1 из 1
Странное поведение запроса в хранимой процедуре.
    #39954108
demwf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем мир! Имею такой запрос на удаление.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
DELETE FROM tbl_clicks 
WHERE id IN (
	SELECT * FROM (
		SELECT id
		FROM tbl_clicks
		WHERE DATE_ADD BETWEEN STR_TO_DATE( '01.01.2019', '%d.%m.%Y' ) AND STR_TO_DATE( '01.01.2020', '%d.%m.%Y' )
		AND conversion_price_main = 0
	) AS cl
);


Отрабатывает долго (много записей на удаление), но все работает.
Помещаю такой запрос в хранимую процедуру, и трутся вообще все записи. Полностью.
Никак не могу понять причину. Такое ощущение что или каких то кешей не хватает, или ограничение на вложенность. Ошибок нет, просто пустая таблица на выходе. Может кто сталкивался с подобным?
Вот текст процедуры:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
DELIMITER $$
USE `tr`$$
DROP PROCEDURE IF EXISTS `b_delete_tbl_clicks`$$
CREATE DEFINER=`mysql`@`%` PROCEDURE `b_delete_tbl_clicks`(OUT `happy_end` BOOLEAN)
    MODIFIES SQL DATA

BEGIN
DELETE FROM tbl_clicks 
WHERE id IN (
		SELECT * FROM (
		SELECT id
		FROM tbl_clicks
		WHERE DATE_ADD BETWEEN STR_TO_DATE( '01.01.2019', '%d.%m.%Y' ) AND STR_TO_DATE( '01.01.2020', '%d.%m.%Y' )
		AND conversion_price_main = 0
	) AS cl
);
SET happy_end = TRUE;
END$$
DELIMITER ;
...
Рейтинг: 0 / 0
Странное поведение запроса в хранимой процедуре.
    #39954124
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
demwf
Имею такой запрос на удаление.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
DELETE FROM tbl_clicks 
WHERE id IN (
	SELECT * FROM (
		SELECT id
		FROM tbl_clicks
		WHERE DATE_ADD BETWEEN STR_TO_DATE( '01.01.2019', '%d.%m.%Y' ) AND STR_TO_DATE( '01.01.2020', '%d.%m.%Y' )
		AND conversion_price_main = 0
	) AS cl
);


А чё так замудрёно-то? почему не просто
Код: sql
1.
2.
3.
4.
5.
DELETE 
FROM tbl_clicks 
WHERE DATE_ADD BETWEEN STR_TO_DATE( '01.01.2019', '%d.%m.%Y' ) 
                   AND STR_TO_DATE( '01.01.2020', '%d.%m.%Y' )
AND conversion_price_main = 0;


?

demwf
Может кто сталкивался с подобным?

Не бывает.
Либо запрос (в т.ч. вызывающий выполнение процедуры) выполняется корректно, либо приводит к ошибке (в т.ч. и внешней, в т.ч. приводящей к повреждению - но всегда детектируемому!- данных). Впрочем, корректное выполнение не означает получение результата, который ты ХОТЕЛ получить - он будет таким, какой ты ПРОСИЛ, а это не всегда одно и то же.

Дамп для воспроизведения проблемы либо ссылку на fiddle - в студию.
...
Рейтинг: 0 / 0
Странное поведение запроса в хранимой процедуре.
    #39954127
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какой-то странный синтаксис для функции DATE_ADD. А если это им поля, тогда при нем обратных кавычек не хватает.

Ну и два уровня вложенности запроса тут лишние, условие WHERE вплне перенести в основной запрос, тогда быстрее заработает.
...
Рейтинг: 0 / 0
Странное поведение запроса в хранимой процедуре.
    #39954142
demwf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina

Дамп для воспроизведения проблемы


Дамп таблицы
https://yadi.sk/d/8py_-EGEi84H5w
...
Рейтинг: 0 / 0
Странное поведение запроса в хранимой процедуре.
    #39954147
demwf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1.
vkle
Какой-то странный синтаксис для функции DATE_ADD. А если это им поля, тогда при нем обратных кавычек не хватает.

Да это имя поля. Синтаксис позволяет, ошибки и предупреждения не генерируются.

2.
vkle
Ну и два уровня вложенности запроса тут лишние, условие WHERE вплне перенести в основной запрос, тогда быстрее заработает.


То что можно обойтись вообще без подзапросов - факт! Но надо именно с подзапросом, потому что пример сильно упрощен, в процессе поиска аномалии. То что 2 уровня вложенности - это не ошибка.
Если сделать 1 уровень вложенности, будет ошибка. Вторым уровнем, я просто фактически создаю копию таблицы под названием cl
Вот ссылка на доку - https://sqlinfo.ru/articles/info/19.html
...
Рейтинг: 0 / 0
Странное поведение запроса в хранимой процедуре.
    #39954161
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
demwf
Дамп таблицы

Я просил дамп для воспроизведения проблемы, а не полгига никак не связанных с проблемой данных... Если проблема есть - для её воспроизведения достаточно десятка записей с входящими в запрос полями.
demwf
надо именно с подзапросом, потому что пример сильно упрощен, в процессе поиска аномалии.

То есть Вы совершаете обычную ошибку - публикуете не проблему, а свои попытки её решить.
demwf
Вот ссылка на доку

Это НЕ ссылка на доку. Доки - это то, что расположено на dev.mysql.com, а всё остальное - лишь размышления поверх.
...
Рейтинг: 0 / 0
Странное поведение запроса в хранимой процедуре.
    #39954257
demwf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina

Я просил дамп для воспроизведения проблемы

Дамп за 10 дней. Можно попробовать например за 01.01.2019
https://yadi.sk/d/thzI9UoNjR6Ieg

Akina

То есть Вы совершаете обычную ошибку - публикуете не проблему, а свои попытки её решить.

Здесь находиться именно проблема, в этом можно убедиться самостоятельно.
Дамп БД и скрипт я предоставил.
...
Рейтинг: 0 / 0
Странное поведение запроса в хранимой процедуре.
    #39954276
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
demwf
Код: sql
1.
DATE_ADD BETWEEN STR_TO_DATE( '01.01.2019', '%d.%m.%Y' ) AND STR_TO_DATE( '01.01.2020', '%d.%m.%Y' )

В DATE_ADD только дата или дата-время?
Если только дата, то вы, помимо 2019 года, еще удалите данные за 1 января 2020 года.
...
Рейтинг: 0 / 0
Странное поведение запроса в хранимой процедуре.
    #39954277
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
demwf
Помещаю такой запрос в хранимую процедуру, и трутся вообще все записи.
Замените в самом начале запроса слово DELETE на SELECT * или SELECT COUNT(*) и проверьте какие записи попадают на удаление.
...
Рейтинг: 0 / 0
Странное поведение запроса в хранимой процедуре.
    #39954280
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
demwf,

Какая у вас версия MySQL?
...
Рейтинг: 0 / 0
Странное поведение запроса в хранимой процедуре.
    #39954298
demwf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft
Спасибо за ответ. Мы примерно об одном подумали.
В начале ответы
miksoft

В DATE_ADD только дата или дата-время?
Если только дата, то вы, помимо 2019 года, еще удалите данные за 1 января 2020 года.

Там дата-время, но период несущественен. Это пример.

miksoft
Замените в самом начале запроса слово DELETE на SELECT * или SELECT COUNT(*) и проверьте какие записи попадают на удаление.

Проверил, параллельно с твоим вопросом. Возвращается 0. Почему и вопросы опишу ниже.

miksoft

Какая у вас версия MySQL?

mysql Ver 14.14 Distrib 5.6.38, for Win32 (AMD64)

Теперь что обнаружил.
Очень странно обрабатывается именно поле date_add. По крайней мере для меня.
Например.
Вот такой запрос - Возвращает какое-то количество записей в таблице:
Код: sql
1.
2.
3.
SELECT COUNT(*)
FROM tbl_clicks 
WHERE DATE_ADD BETWEEN STR_TO_DATE( '01.01.2019', '%d.%m.%Y' ) AND STR_TO_DATE( '01.01.2020', '%d.%m.%Y' )



А вот такой запрос, уже возвращает 0.
Код: sql
1.
2.
3.
4.
SELECT COUNT(*)
FROM tbl_clicks 
WHERE DATE_ADD BETWEEN STR_TO_DATE( '01.01.2019', '%d.%m.%Y' ) AND STR_TO_DATE( '01.01.2020', '%d.%m.%Y' )
AND conversion_price_main = 0


Разница, что добавилось последнее условие. Забегу вперед и скажу, что записи с условием conversion_price_main = 0 точно есть.

Раз понятно, что проблема с датой, добавил функцию date() во второй вариант, который ранее возвращал 0
Код: sql
1.
2.
3.
4.
SELECT COUNT(*)
FROM tbl_clicks 
WHERE DATE(DATE_ADD) BETWEEN STR_TO_DATE( '01.01.2019', '%d.%m.%Y' ) AND STR_TO_DATE( '01.01.2020', '%d.%m.%Y' )
AND conversion_price_main = 0



И возвращаются опять значение. Но уже отличное от первого варианта (спишем на лишние сутки из-за часов, хотя разбег слишком значительный. Вероятно первый вариант не верный).
Понятно что именно последний вариант верный, хотя уже сомнения и по этому поводу.
Но у меня ряд вопросов.
1. Почему добавление дополнительного условия (без использования date), возвращает 0?
2. Почему все таки чистилась вся таблица? Ведь id из этой же таблицы, не мог равняться конкретным значениям?
...
Рейтинг: 0 / 0
Странное поведение запроса в хранимой процедуре.
    #39954315
demwf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
demwf

1. Почему добавление дополнительного условия (без использования date), возвращает 0?

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


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