18.7.2 Проблемы с таблицами MERGE
Ниже перечислены известные проблемы с таблицами MERGE:
Подчиненные таблицы блокируются через родительскую таблицу. Если родительская таблица временная, она не блокируется, и, следовательно, подчиненные таблицы тоже не блокируются; это означает, что параллельное использование базовых таблиц MyISAM приводит к их повреждению.
Если вы используете ALTER TABLE для изменения таблицы MERGE на другой тип двигателя хранилища, отображение на базовые таблицы теряется. Вместо этого данные из базовых таблиц копируются в изменённую таблицу, которая затем использует указанный тип двигателя хранилища.
Опция таблицы MERGE для таблицы MERGE указывает, какую базу таблиц MERGE использовать для вставки в таблицу MERGE. Однако использование опции таблицы MERGE для данной таблицы не влияет на вставки в таблицу MERGE, пока хотя бы одна строка не будет вставлена напрямую в таблицу MERGE.
Таблица MERGE не может поддерживать ограничения уникальности для всей таблицы. При выполнении INSERT, данные попадают в первую или последнюю базу таблиц MERGE (определяется опцией MERGE). MySQL гарантирует, что значения уникальных ключей остаются уникальными в данной базе таблиц MERGE, но не во всех базах таблиц MERGE в коллекции.
-
Поскольку движок MERGE не может обеспечить уникальность по набору базовых таблиц, REPLACE не работает как ожидается. Два ключевых момента:
REPLACE может обнаруживать нарушения уникальности ключей только в той базе таблиц MERGE, в которую он будет писать (определяется опцией MERGE). Это отличается от нарушений в самой таблице MERGE.
Если REPLACE обнаруживает нарушение уникальности ключа, он изменяет только соответствующую строку в базе таблиц MERGE, в которую он записывает; то есть, в первую или последнюю таблицу, в зависимости от опции MERGE.
Аналогичные соображения относятся к INSERT ... ON DUPLICATE KEY UPDATE.
Таблицы MERGE не поддерживают разбиение. То есть, вы не можете разбить таблицу MERGE, и ни одна из базовых таблиц MERGE не может быть разбита.
-
Не следует использовать ANALYZE TABLE, REPAIR TABLE, OPTIMIZE TABLE, ALTER TABLE, DROP TABLE, DELETE без клаузы MERGE или TRUNCATE TABLE для любых таблиц, отображённых в открытую таблицу MERGE. Если вы это сделаете, таблица MERGE может по-прежнему ссылаться на исходную таблицу и давать неожиданные результаты. Чтобы обойти эту проблему, убедитесь, что нет открытых таблиц MERGE, выполнив оператор FLUSH TABLES перед выполнением каких-либо перечисленных операций.
Неожиданные результаты могут включать сообщение об ошибке повреждения таблицы MERGE после одной из перечисленных операций с базовыми таблицами. Если это произойдёт после одной из перечисленных операций с базовыми таблицами, сообщение об ошибке повреждения является ложным. Для решения этой проблемы выполните оператор FLUSH TABLES после изменения базовых таблиц.
DROP TABLE для таблицы, используемой таблицей MERGE, не работает в Windows, потому что отображение таблиц двигателя хранилища MERGE скрыто от верхнего уровня MySQL. Windows не позволяет удалять открытые файлы, поэтому вы сначала должны очистить все таблицы MERGE (с помощью FLUSH TABLES) или удалить таблицу MERGE перед удалением таблицы.
Определения базовых таблиц MERGE и таблицы MERGE проверяются при обращении к таблицам (например, в рамках оператора SELECT или INSERT). Проверки гарантируют соответствие определений таблиц и родительской таблицы MERGE по порядку столбцов, типам, размерам и связанным индексам. Если есть разница между таблицами, возвращается ошибка, и оператор завершается ошибкой. Поскольку эти проверки происходят при открытии таблиц, любые изменения в определении одной таблицы, включая изменения столбцов, порядок столбцов и изменения движка, приводят к завершению оператора с ошибкой.
Порядок индексов в таблице MERGE и её базовых таблицах должен быть одинаковым. Если вы используете ALTER TABLE для добавления индекса уникальности к таблице, используемой в таблице MERGE, а затем ALTER TABLE для добавления неодинакового индекса к таблице MERGE, порядок индексов для таблиц отличается, если в базе таблиц MERGE уже был неодинаковый индекс. (Это происходит потому, что ALTER TABLE ставит индексы уникальности перед неодинаковыми индексами для ускорения обнаружения дубликатов ключей.) В результате запросы к таблицам с такими индексами могут возвращать неожиданные результаты.
Если вы столкнулись с сообщением об ошибке, похожим на ОШИБКА 1017 (HY000): Не удалось найти файл: '
tbl_name.MRG' (код ошибки: 2), это обычно означает, что некоторые из базовых таблиц не используют двигатель хранилища MERGE. Подтвердите, что все эти таблицы работают корректно.Максимальное количество строк в таблице MERGE составляет 264 (~1.844E+19; такое же, как и для таблицы MERGE). Объединение нескольких таблиц MERGE в одну таблицу 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 с MERGE, ни как временную таблицу MERGE, ни как невременную таблицу MERGE. Например:
CREATE TABLE m1 ... ENGINE=MRG_MYISAM ... SELECT ...;
Попытка сделать это приводит к ошибке:
tbl_nameне являетсяBASE TABLE. В некоторых случаях различные значения опции таблицы MERGE в таблице MERGE и базовых таблицах приводят к неожиданным результатам, если базовые таблицы содержат столбцы MERGE или столбцы MERGE. В качестве обходного решения используйте FLUSH TABLES для того, чтобы убедиться, что у всех вовлеченных таблиц одинаковое значение опции MERGE. (Баг #50646)
© 2025 Oracle
Licensed under the GPLv2 License.