MRG_MyISAM Помогите разобраться с ключами

Eugene7

Новичок
MRG_MyISAM Помогите разобраться с ключами

Здравствуйте!
Я прочитал, что при создании таблиц типа merge проверок на согласованность структуры объединяемых таблиц не делается.
Возможно с этим связаны странныые ошибки, которые периодически выскакивают при работе с этими таблицами.
Но если использовать ALTER TABLE , то что-то, похоже, проверяется.
Пока нет ключей, все вроде норамльно, а вот ввести ключи не получается.
Мне важно в объединяемых таблицах иметь PRIMARY KEY , но не могу найти способа объединить таблицы содержащие PRIMARY KEY в MERGE .
Вот так, например, не проходит:

PHP:
DROP TABLE IF EXISTS test.all_posts;     DROP TABLE IF EXISTS test.one_post;     CREATE TABLE test.one_post ( `num` INT(11) ,   PRIMARY KEY (`num`)    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;      CREATE TABLE test.all_posts ( `num` INT(11) ,   KEY (`num`)    ) ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8 UNION=(test.one_post );      ALTER TABLE test.all_posts UNION=(test.one_post);      Error: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist
 

svetasmirnova

маленький монстрик
Всё дело в том, что для таблицы one_post колонка num преобразуется в `num` int(11) NOT NULL DEFAULT '0', а для MERGE таблицы это не так. Сообтветственно решение - указать NOT NULL DEFAULT '0' explicitly:

PHP:
mysql> DROP TABLE IF EXISTS all_posts;
Query OK, 0 rows affected (0.07 sec)

mysql> DROP TABLE IF EXISTS one_post;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE one_post ( `num` INT(11) , PRIMARY KEY (`num`)) ENGINE=MyISAM;
Query OK, 0 rows affected (0.07 sec)

mysql> SHOW CREATE TABLE one_post;
+----------+----------------------------------------------------------------------------------------------------------------------------+
| Table    | Create Table                                                                                                               |
+----------+----------------------------------------------------------------------------------------------------------------------------+
| one_post | CREATE TABLE `one_post` (
  `num` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`num`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 | 
+----------+----------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> CREATE TABLE all_posts( `num` INT(11), KEY(`num`)) ENGINE=MRG_MyISAM UNION=(one_post );
Query OK, 0 rows affected (0.06 sec)

mysql> ALTER TABLE all_posts UNION=(one_post);
ERROR 1168 (HY000): Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist
mysql> DROP TABLE all_posts;
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE all_posts( `num` INT(11) NOT NULL DEFAULT '0') ENGINE=MRG_MyISAM UNION=(one_post );
Query OK, 0 rows affected (0.07 sec)

mysql> ALTER TABLE all_posts UNION=(one_post);
Query OK, 0 rows affected (0.10 sec)
Records: 0  Duplicates: 0  Warnings: 0
 

Eugene7

Новичок
Спасибо, за подробное объяснение!
Но, занятно, что у меня даже так не работает.
Пришлось ещё добавить при создании таблицы all_posts PRIMARY, как и в one_post.

Даже не знаю чем это объяснить.
Наверно разницей в версиях MySQL?
На всякий случай у меня 5.0.0
А у вас?
 

svetasmirnova

маленький монстрик
> На всякий случай у меня 5.0.0

Серьёзно? Текущая версия - 5.0.77. Срочно обновляться.
 

weregod

unserializer
на одном из первых 5-билдов у меня вообще при каких-то запросах рассыпался mysql-сервис (правда, под win32), так что иногда обновляться критично
 

svetasmirnova

маленький монстрик
grigori
Такие проблемы будут как описана. И проверять как там что в 5.0.0 работает и чем отличается от текущего у меня лично никакого желания нет. Вообще огромное количество багов было исправлено после 5.0.0. Если у топикстартера в самом деле такой антиквариат.
vovanium
Потому что 5.1 - это другой мажорный релиз. Там могут быть несовместимости. А рассматриваемый здесь код ведёт себя одинаково во всех поддерживаемых версиях, поэтому настаивать на обновлении до GA только потому, что это GA смысла нет. А вот 5.0.0 -> текущий 5.0 есть.
 

vovanium

Новичок
svetasmirnova
Ну так учитывая что у него там вообще альфа-версия, т.е. там вообще может и половины функций нет которые есть даже в 5.0.77
 

Eugene7

Новичок
Автор оригинала: vovanium
svetasmirnova
Ну так учитывая что у него там вообще альфа-версия, т.е. там вообще может и половины функций нет которые есть даже в 5.0.77
Я вот прочитал:

In MySQL 5.1.15 and later, the definition of the MyISAM tables and the MERGE table are checked when the tables are accessed (for example, as part of a SELECT or INSERT statement). The checks ensure that the definitions of the tables and the parent MERGE table definition match by comparing column order, types, sizes and associated indexes. If there is a difference between the tables then an error will be returned and the statement will fail. Because these checks take place when the tables are opened, any changes to the definition of a single table, including column changes, column ordering and engine alterations will cause the statement to fail. In

MySQL 5.1.14 and earlier: When you create or alter MERGE table, there is no check to ensure that the underlying tables are existing MyISAM tables and have identical structures. When the MERGE table is used, MySQL checks that the row length for all mapped tables is equal, but this is not foolproof. If you create a MERGE table from dissimilar MyISAM tables, you are very likely to run into strange problems.
Значит мне надо ставить MySQL Server Community Edition
GA 5.1.34 ? Чтобы не отставать от времени.
Это вроде бы рекомендованная на данный момент времени версия.
 

svetasmirnova

маленький монстрик
Я так понимаю, что ты не поддерживаешь ранее написанное под 5.0 приложение, поэтому ответ - да.
 
Сверху