15.7.2 Проблемы с таблицами MERGE
Ниже перечислены известные проблемы с таблицами MERGE:
Дочерние таблицы блокируются через родительскую таблицу. Если родительская таблица временная, она не блокируется, а значит, и дочерние таблицы также не блокируются; это означает, что одновременное использование базовых таблиц MyISAM может привести к их повреждению.
Если вы используете ALTER TABLE для изменения типа таблицы MERGE на другой движок хранения, отображение на базовые таблицы теряется. Вместо этого данные из базовых таблиц копируются в изменённую таблицу, которая затем использует указанный движок хранения.
Параметр таблицы MERGE для таблицы MERGE указывает, какую базу таблиц использовать для вставок в таблицу MERGE. Однако использование параметра таблицы MERGE для этой таблицы MERGE не имеет эффекта для вставок в таблицу MERGE, пока, по крайней мере, одна строка не будет вставлена непосредственно в таблицу MERGE.
Таблица MERGE не может поддерживать ограничения уникальности для всей таблицы. При выполнении INSERT данные помещаются в первую или последнюю базу таблиц (в зависимости от параметра MERGE). MySQL гарантирует, что значения уникальных ключей остаются уникальными в пределах этой базы таблиц, но не по всем базовым таблицам в наборе.
-
Поскольку движок MERGE не может обеспечить уникальность по набору базовых таблиц, REPLACE не работает как ожидается. Два ключевых факта:
REPLACE может обнаружить нарушения уникальности только в той базе таблиц, в которую будет записываться (что определяется параметром MERGE). Это отличается от нарушений в самой таблице MERGE.
Если REPLACE обнаруживает нарушение уникальности, он изменяет только соответствующую строку в базе таблиц, в которую записывается; то есть, первую или последнюю таблицу, как определяется параметром MERGE.
Аналогичные соображения применяются к INSERT ... ON DUPLICATE KEY UPDATE.
Таблицы MERGE не поддерживают разбиение. То есть вы не можете разбить таблицу 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 проверяются при доступе к таблицам (например, в рамках оператора 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, которая имела бы более этого числа строк.
Использование базовых таблиц 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 или
BINARY. В качестве обходного решения используйте FLUSH TABLES для обеспечения того, чтобы все участвующие таблицы имели одинаковое значение параметра MERGE. (Ошибка #50646)
© 2025 Oracle
Licensed under the GPLv2 License.