Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Странное поведение запроса в хранимой процедуре. / 12 сообщений из 12, страница 1 из 1
04.05.2020, 16:56
    #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
04.05.2020, 18:04
    #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
04.05.2020, 18:08
    #39954127
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение запроса в хранимой процедуре.
Какой-то странный синтаксис для функции DATE_ADD. А если это им поля, тогда при нем обратных кавычек не хватает.

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

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


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

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

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


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

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

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

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

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

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

Akina

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

Здесь находиться именно проблема, в этом можно убедиться самостоятельно.
Дамп БД и скрипт я предоставил.
...
Рейтинг: 0 / 0
05.05.2020, 10:29
    #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
05.05.2020, 10:31
    #39954277
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение запроса в хранимой процедуре.
demwf
Помещаю такой запрос в хранимую процедуру, и трутся вообще все записи.
Замените в самом начале запроса слово DELETE на SELECT * или SELECT COUNT(*) и проверьте какие записи попадают на удаление.
...
Рейтинг: 0 / 0
05.05.2020, 10:43
    #39954280
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение запроса в хранимой процедуре.
demwf,

Какая у вас версия MySQL?
...
Рейтинг: 0 / 0
05.05.2020, 13:03
    #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
05.05.2020, 13:50
    #39954315
demwf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение запроса в хранимой процедуре.
demwf

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

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


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