Spec-Zone.ru › MariaDB

MERGE

Описание

Двигатель хранения MERGE, также известный как двигатель MRG_MyISAM, представляет собой набор идентичных таблиц MyISAM, которые могут использоваться как одна. «Идентичные» означает, что все таблицы имеют одинаковую информацию о столбцах и индексах. Вы не можете объединить таблицы MyISAM, в которых столбцы перечислены в разном порядке, не имеют точно таких же столбцов или имеют индексы в разном порядке. Однако любая или все таблицы MyISAM могут быть сжаты с помощью myisampack. Имена столбцов и имен индексов могут отличаться, при условии, что типы данных и условия NULL/NOT NULL одинаковы. Различия в параметрах таблицы, таких как AVG_ROW_LENGTH, MAX_ROWS или PACK_KEYS, не имеют значения.

Каждый индекс в таблице MERGE должен соответствовать индексу в базовых таблицах MyISAM, но обратное неверно. Кроме того, таблица MERGE не может иметь первичный ключ или уникальные индексы, так как она не может обеспечить уникальность по всем базовым таблицам.

Следующие параметры имеют значение для таблиц MERGE:

  • UNION. Этот параметр задает список базовых таблиц MyISAM. Список заключён в скобки и разделен запятыми.
  • INSERT_METHOD. Этот параметр задаёт, разрешены ли и как INSERTы для таблицы. Разрешённые значения: NO (INSERTы не разрешены), FIRST (новые строки будут записаны в первую таблицу, указанную в списке UNION), LAST (новые строки будут записаны в последнюю таблицу, указанную в списке UNION). Значение по умолчанию — NO.

Если вы определите таблицу MERGE с определением, отличным от базовых таблиц MyISAM, или одна из базовых таблиц не является MyISAM, оператор CREATE TABLE не вернёт никакой ошибки. Но любая операция, которая включает в себя таблицу, выдаст ошибку, подобную следующей:

ERROR 1168 (HY000): Unable to open underlying table which is differently defined 
  or of non-MyISAM type or doesn't exist

A CHECK TABLE покажет более подробную информацию о проблеме.

Ошибка также возникает, если таблица определена правильно, но определение базовой таблицы меняется в какой-то момент времени.

Если вы попытаетесь вставить новую строку в таблицу MERGE с INSERT_METHOD=NO, получите ошибку, подобную следующей:

ERROR 1036 (HY000): Table 'tbl_name' is read only

Возможна создание таблицы MERGE на таблицах MyISAM, которые имеют один или несколько виртуальных столбцов. Сам MERGE не поддерживает виртуальные столбцы, поэтому такие столбцы будут видны как обычные столбцы. Типы данных и размеры по-прежнему должны быть идентичны, и они не могут быть NOT NULL.

Примеры

CREATE TABLE t1 (
    a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    message CHAR(20)) ENGINE=MyISAM;

CREATE TABLE t2 (
    a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    message CHAR(20)) ENGINE=MyISAM;


INSERT INTO t1 (message) VALUES ('Testing'),('table'),('t1');

INSERT INTO t2 (message) VALUES ('Testing'),('table'),('t2');

CREATE TABLE total (
    a INT NOT NULL AUTO_INCREMENT,
    message CHAR(20), INDEX(a))
    ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;

SELECT * FROM total;
+---+---------+
| a | message |
+---+---------+
| 1 | Testing |
| 2 | table   |
| 3 | t1      |
| 1 | Testing |
| 2 | table   |
| 3 | t2      |
+---+---------+

В следующем примере мы создадим три таблицы MyISAM, а затем таблицу MERGE на них. Однако одна из них использует другой тип данных для столбца b, поэтому SELECT выдаст ошибку:

CREATE TABLE t1 (
  a INT,
  b INT
) ENGINE = MyISAM;

CREATE TABLE t2 (
  a INT,
  b INT
) ENGINE = MyISAM;

CREATE TABLE t3 (
  a INT,
  b TINYINT
) ENGINE = MyISAM;

CREATE TABLE t_mrg (
  a INT,
  b INT
) ENGINE = MERGE,UNION=(t1,t2,t3);

SELECT * FROM t_mrg;
ERROR 1168 (HY000): Unable to open underlying table which is differently defined
 or of non-MyISAM type or doesn't exist

Чтобы выяснить, в чём проблема, воспользуемся CHECK TABLE:

CHECK TABLE t_mrg\G
*************************** 1. row ***************************
   Table: test.t_mrg
      Op: check
Msg_type: Error
Msg_text: Table 'test.t3' is differently defined or of non-MyISAM type or doesn't exist
*************************** 2. row ***************************
   Table: test.t_mrg
      Op: check
Msg_type: Error
Msg_text: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist
*************************** 3. row ***************************
   Table: test.t_mrg
      Op: check
Msg_type: error
Msg_text: Corrupt

Теперь мы знаем, что проблема в определении t3.

Содержимое, воспроизведённое на этом сайте, является собственностью его соответствующих владельцев, и это содержание не предварительно проверяется 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/merge/

Spec-Zone.ru

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