Spec-Zone.ru › MariaDB

Двигатель хранения последовательностей

В этой статье описывается движок хранения последовательностей. Подробную информацию о последовательностях см. в последовательностях.

Двигатель последовательности позволяет создавать возрастающие или убывающие последовательности чисел (положительные целые числа) с заданным начальным значением, конечным значением и шагом.

Он автоматически создаёт полностью виртуальные, временные таблицы по мере необходимости. Нет возможности явно создать таблицу Sequence. Они также никогда не записываются на диск или не создают файлы .frm. Они являются только для чтения, транзакционными и поддерживают XA.

Установка

Движок Sequence установлен по умолчанию, и SHOW ENGINES отобразит движок Sequence как поддерживаемый:

SHOW ENGINES\G
...
*************************** 5. row ***************************
      Engine: MyISAM
     Support: YES
     Comment: MyISAM storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 6. row ***************************
      Engine: SEQUENCE
     Support: YES
     Comment: Generated tables filled with sequential values
Transactions: YES
          XA: YES
  Savepoints: YES
*************************** 7. row ***************************
      Engine: MRG_MyISAM
     Support: YES
     Comment: Collection of identical MyISAM tables
Transactions: NO
          XA: NO
  Savepoints: NO

...

Использование и примеры

Чтобы использовать таблицу Sequence, просто выполните выбор из неё, как в

SELECT * FROM seq_1_to_5;
+-----+
| seq |
+-----+
|   1 |
|   2 |
|   3 |
|   4 |
|   5 |
+-----+

Для использования последовательности в операторе выполняется выбор из таблицы с именем, соответствующим шаблону seq_FROM_to_TO или seq_FROM_to_TO_step_STEP.

В случае нечётного шага последовательность начнется с FROM, и закончится последним значением до TO.

SELECT * FROM seq_1_to_15_step_3;
+-----+
| seq |
+-----+
|   1 |
|   4 |
|   7 |
|  10 |
|  13 |
+-----+

Последовательность может также идти в обратном направлении. В этом случае конечное значение всегда будет TO значением, так что убывающая последовательность имеет те же значения, что и возрастающая последовательность:

SELECT * FROM seq_5_to_1_step_2;
+-----+
| seq |
+-----+
|   5 |
|   3 |
|   1 |
+-----+
SELECT * FROM seq_15_to_1_step_3;
+-----+
| seq |
+-----+
|  13 |
|  10 |
|   7 |
|   4 |
|   1 |
+-----+
SELECT * FROM seq_15_to_2_step_3;
+-----+
| seq |
+-----+
|  14 |
|  11 |
|   8 |
|   5 |
|   2 |
+-----+

Этот движок особенно полезен при использовании объединений и подзапросов. Например, этот запрос находит все простые числа меньше 50:

SELECT seq FROM seq_2_to_50 s1 WHERE 0 NOT IN
     (SELECT s1.seq % s2.seq FROM seq_2_to_50 s2 WHERE s2.seq <= sqrt(s1.seq));
+-----+
| seq |
+-----+
|   2 |
|   3 |
|   5 |
|   7 |
|  11 |
|  13 |
|  17 |
|  19 |
|  23 |
|  29 |
|  31 |
|  37 |
|  41 |
|  43 |
|  47 |
+-----+

И почти (без 2, единственного чётного простого числа) тот же результат с объединениями:

SELECT s1.seq FROM seq_2_to_50 s1 JOIN seq_2_to_50 s2 
  WHERE s1.seq > s2.seq AND s1.seq % s2.seq <> 0 
  GROUP BY s1.seq HAVING s1.seq - COUNT(*) = 2;
+-----+
| seq |
+-----+
|   3 |
|   5 |
|   7 |
|  11 |
|  13 |
|  17 |
|  19 |
|  23 |
|  29 |
|  31 |
|  37 |
|  41 |
|  43 |
|  47 |
+-----+

Таблицы последовательностей также могут быть полезны при расчётах дат. Например, чтобы определить день недели, на который выпадает определённая дата в течение 40-летнего периода (возможно, для планирования дней рождения!):

SELECT DAYNAME('1980-12-05' + INTERVAL (seq) YEAR) day,
    '1980-12-05' + INTERVAL (seq) YEAR date FROM seq_0_to_40;
+-----------+------------+
| day       | date       |
+-----------+------------+
| Friday    | 1980-12-05 |
| Saturday  | 1981-12-05 |
| Sunday    | 1982-12-05 |
...
| Friday    | 2014-12-05 |
| Saturday  | 2015-12-05 |
| Monday    | 2016-12-05 |
| Tuesday   | 2017-12-05 |
| Wednesday | 2018-12-05 |
| Thursday  | 2019-12-05 |
| Saturday  | 2020-12-05 |
+-----------+------------+

Хотя таблицы последовательностей могут напрямую использовать только положительные целые числа, они могут косвенно возвращать отрицательные результаты, используя оператор CAST. Например:

SELECT CAST(seq AS INT) - 5 x FROM seq_5_to_1;
+----+
| x  |
+----+
|  0 |
| -1 |
| -2 |
| -3 |
| -4 |
+----+

CAST необходим для избежания ошибки BIGINT UNSIGNED value is out of range.

Таблицы последовательностей, хотя и виртуальные, всё же являются таблицами, поэтому они должны находиться в базе данных. Это означает, что необходимо выбрать базу данных по умолчанию (например, с помощью команды USE), чтобы иметь возможность запросить таблицу Sequence. База данных information_schema не может быть использована в качестве базы данных по умолчанию для таблицы Sequence.

Конфликты имён таблиц

Если движок SEQUENCE установлен, невозможно создать таблицу с именем, которое соответствует шаблону SEQUENCE:

CREATE TABLE seq_1_to_100 (col INT) ENGINE = InnoDB;
ERROR 1050 (42S01): Table 'seq_1_to_100' already exists

Однако таблицу SEQUENCE можно преобразовать в другой движок, и новая таблица может быть упомянута в любом операторе:

ALTER TABLE seq_1_to_100 ENGINE = BLACKHOLE;

SELECT * FROM seq_1_to_100;
Empty set (0.00 sec)

Хотя таблицу SEQUENCE нельзя удалить, можно удалить преобразованную таблицу. Таблица SEQUENCE с тем же именем по-прежнему будет существовать:

DROP TABLE seq_1_to_100;

SELECT COUNT(*) FROM seq_1_to_100;
+----------+
| COUNT(*) |
+----------+
|      100 |
+----------+
1 row in set (0.00 sec)

Временную таблицу с именем, подобным SEQUENCE, всегда можно создать и использовать:

CREATE TEMPORARY TABLE seq_1_to_100 (col INT) ENGINE = InnoDB;

SELECT * FROM seq_1_to_100;
Empty set (0.00 sec)

См. также

  • Для получения подробной информации о последовательностях см. последовательности.
  • Иногда это мелочи - Dean Ellis тестирует движок Sequence.
  • Двигатель хранения последовательностей MariaDB - Federico Razzoli пишет более подробное описание движка.
Содержимое, воспроизводимое на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проходит предварительную проверку MariaDB. Мнения, информация и мнения, выраженные в этом содержании, не обязательно отражают мнения MariaDB или любой другой стороны.

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/sequence-storage-engine/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API