Spec-Zone.ru › MySQL 8.4

18.7.2 Проблемы таблиц MERGE

Ниже перечислены известные проблемы с таблицами MERGE:

  • Дочерние таблицы блокируются через родительскую таблицу. Если родительская таблица является временной, она не блокируется, а следовательно, не блокируются и дочерние таблицы; это означает, что параллельное использование базовых таблиц MyISAM их повреждает.

  • Если вы используете ALTER TABLE для изменения таблицы MERGE на другой движок хранения, сопоставление с базовыми таблицами теряется. Вместо этого строки из базовых таблиц копируются в изменённую таблицу, которая затем использует указанный движок хранения.

  • Параметр `table` для таблицы MERGE указывает, какую базу таблиц использовать для вставок в таблицу MERGE. Однако использование параметра `table` для этой таблицы не оказывает никакого влияния на вставки в таблицу MERGE, пока хотя бы одна строка не будет вставлена непосредственно в таблицу.

  • Таблица MERGE не может поддерживать ограничения уникальности для всей таблицы. При выполнении INSERT, данные записываются в первую или последнюю базу таблиц (в зависимости от параметра `table`). MySQL гарантирует, что значения уникальных ключей остаются уникальными в данной базе таблиц, но не во всех базах таблиц в наборе.

  • Поскольку движок MERGE не может обеспечить уникальность на множестве базовых таблиц, REPLACE не работает так, как ожидается. Две ключевые особенности:

    • REPLACE может обнаруживать нарушения уникального ключа только в базовой таблице, в которую будет записываться (которая определяется параметром `table`). Это отличается от нарушений в самой таблице MERGE.

    • Если REPLACE обнаруживает нарушение уникального ключа, он изменяет только соответствующую строку в базовой таблице, в которую он записывает; то есть, первую или последнюю таблицу, как определяется параметром `table`.

    Аналогичные соображения применяются к INSERT ... ON DUPLICATE KEY UPDATE.

  • Таблицы MERGE не поддерживают разбиение. То есть, вы не можете разбить таблицу MERGE, и ни одна из базовых таблиц таблицы MERGE не может быть разбита.

  • Не следует использовать ANALYZE TABLE, REPAIR TABLE, OPTIMIZE TABLE, ALTER TABLE, DROP TABLE, DELETE без предложения `table`, или TRUNCATE TABLE для каких-либо таблиц, сопоставленных с открытой таблицей MERGE. В противном случае таблица MERGE может все еще ссылаться на исходную таблицу и привести к неожиданным результатам. Чтобы обойти эту проблему, убедитесь, что все открытые таблицы MERGE закрыты, выполнив оператор FLUSH TABLES перед выполнением любых из перечисленных операций.

    Неожиданные результаты могут включать возможность того, что операция над таблицей MERGE сообщает о повреждении таблицы. Если это происходит после одной из перечисленных операций над базовыми таблицами, сообщение о повреждении ложное. Для решения этой проблемы выполните оператор FLUSH TABLES после изменения базовых таблиц.

  • DROP TABLE для таблицы, используемой таблицей MERGE, не работает в Windows, так как сопоставление таблиц движка хранения MERGE скрыто от верхнего уровня MySQL. Windows не допускает удаления открытых файлов, поэтому сначала необходимо очистить все таблицы MERGE (с помощью FLUSH TABLES) или удалить таблицу MERGE перед удалением таблицы.

  • Определения таблиц MERGE и родительской таблицы проверяются при доступе к таблицам (например, в рамках оператора SELECT или INSERT). Проверки гарантируют соответствие определений таблиц и родительской таблицы MERGE, сравнивая порядок столбцов, типы, размеры и связанные индексы. При наличии различий между таблицами возвращается ошибка, и операция завершается с ошибкой. Поскольку эти проверки выполняются при открытии таблиц, любые изменения в определении отдельной таблицы, включая изменения столбцов, порядок столбцов и изменения движка, приводят к ошибке выполнения операции.

  • Порядок индексов в таблице MERGE и её базовых таблицах должен быть одинаковым. Если вы используете ALTER TABLE для добавления индекса в таблицу, используемую в таблице MERGE, а затем ALTER TABLE для добавления не уникального индекса в базу таблиц, порядок индексов отличается, если в базовой таблице уже был не уникальный индекс. (Это происходит потому, что ALTER TABLE ставит уникальные индексы перед не уникальными индексами, чтобы облегчить быстрое обнаружение дубликатов ключей.) Вследствие этого запросы к таблицам с такими индексами могут возвращать неожиданные результаты.

  • Если вы столкнулись с сообщением об ошибке, похожим на ERROR 1017 (HY000): Can't find file: 'tbl_name.MRG' (errno: 2), это, как правило, означает, что некоторые из базовых таблиц не используют движок хранения MERGE. Убедитесь, что все эти таблицы используют движок MERGE.

  • Максимальное количество строк в таблице MERGE равно 264 (~1.844E+19; как и в таблице обычного типа). Невозможно объединить несколько таблиц MERGE в одну таблицу MERGE, которая имела бы больше строк.

  • Использование базовых таблиц с различными форматами строк с родительской таблицей MERGE в настоящее время приводит к сбою. См. ошибку #32364.

  • Нельзя изменить список объединения для не временной таблицы MERGE, когда LOCK TABLES активен. Следующее не работает:

    CREATE TABLE m1 ... ENGINE=MRG_MYISAM ...;
    LOCK TABLES t1 WRITE, t2 WRITE, m1 WRITE;
    ALTER TABLE m1 ... UNION=(t1,t2) ...;
    

    Однако это можно сделать с временной таблицей MERGE.

  • Нельзя создать таблицу MERGE с параметром `table`, ни как временную таблицу MERGE, ни как не временную таблицу MERGE. Например:

    CREATE TABLE m1 ... ENGINE=MRG_MYISAM ... SELECT ...;

    Попытка сделать это приводит к ошибке: tbl_name не является BASE TABLE.

  • В некоторых случаях разные значения параметра `table` для таблицы MERGE и базовых таблиц могут привести к неожиданным результатам, если базовые таблицы содержат столбцы с определённым типом данных или размерностью. В качестве обходного решения используйте `FLUSH TABLES` для обеспечения одинакового значения параметра `table` для всех вовлеченных таблиц. (Ошибка #50646)

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/merge-table-problems.html

Spec-Zone.ru

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