da sh (-) в предложении where с функцией сна - PullRequest
0 голосов
/ 29 мая 2020

В MySQL вы можете приостановить результат на x секунд с помощью SLEEP функции .

Я понимаю, когда вы используете это так:

SELECT SLEEP(1000);

Но недавно я увидел, что вы можете улучшить запрос в такой форме:

mysql> select * from docs where rev = 1-sleep(4);

, и он будет ждать 4 секунды, прежде чем вернет результаты по сравнению с

mysql> select * from docs where rev = 1;

Почему это так? Является ли da sh формой конкатенации функций или чем-то подобным? Я не смог найти объяснения этому синтаксису.


Я воспроизвел этот запрос, используя docker

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:latest
docker exec -ti some-mysql mysql -uroot -pmy-secret-pw

и следующий код для создания таблицы (используя код из sql fiddle ) и проверьте поведение.

CREATE test;
USE test;
CREATE TABLE IF NOT EXISTS `docs` (
  `id` int(6) unsigned NOT NULL,
  `rev` int(3) unsigned NOT NULL,
  `content` varchar(200) NOT NULL,
  PRIMARY KEY (`id`,`rev`)
) DEFAULT CHARSET=utf8;
INSERT INTO `docs` (`id`, `rev`, `content`) VALUES
  ('1', '1', 'The earth is flat'),
  ('2', '1', 'One hundred angels can dance on the head of a pin'),
  ('1', '2', 'The earth is flat and rests on a bull\'s horn'),
  ('1', '3', 'The earth is like a ball.');
select * from docs where rev = 1;
select * from docs where rev = 1-sleep(4);

1 Ответ

4 голосов
/ 29 мая 2020

Как вы можете прочитать в руководстве, которое вы связали, SLEEP возвращает 0. Таким образом, использование его в некоторых вычислениях, таких как where rev = 1-sleep(4);, запускает выполнение SLEEP (например: ждет четыре секунды). После этого запрос возобновляется с where rev = 1-0, что делает его равным where rev = 1

...