Задавайте вопросы, мы ответим
Вы не зашли.
Добрый вечер! Столкнулся с проблемой: создал 2 таблицы с одинаковым набором атрибутов. Объединил их в Merge-таблицу, и при попытке выборки (select * from table_name) из созданной таблицы, получил ошибку: Error 1168: Unable to open underlying table which is differently defined or non-MyISAM type or doesn`t exist.
И как с этим бороться?
Неактивен
«2 таблицы с одинаковым набором атрибутов» должны быть типа MyISAM.
Неактивен
Так и есть, 2 таблицы MyISAM соединяю в Merge.
Неактивен
Структуру всех трех табличек покажите, пожалуйста.
SHOW CREATE TABLE a;
Неактивен
Create table users (id_user int not null primary key auto_increment,
Surname tinytext not null,
Name tinytext not null,
Phone varchar(255),
Login tinytext not null);
Create table user1 (id_user int not null primary key auto_increment,
Surname tinytext not null,
Name tinytext not null,
Phone varchar(255),
Login tinytext not null);
Create table total (id_user int not null primary key auto_increment,
Surname tinytext not null,
Name tinytext not null,
Phone varchar(255),
Login tinytext not null)
Engine=merge union=(users,user1) insert_method=last;
Неактивен
Если первые две таблички действительно MyISAM, то должно работать. Убедитесь
еще раз в том, что они именно этого типа, что Вы можете делать выборки из каждой из них
по отдельности без проблем. Если все так, тогда это бага. Разумеется, если версия сервера
не последняя, то следует обновить сервер и проверить, что последняя версия сервера тоже
ведет себя так же.
Из других мыслей — может быть, например, одна табличка от «старого сервера», а вторая —
от «нового»? Так, что у них разные внутренние форматы? Посмотреть можно в
SHOW TABLE STATUS LIKE 'user%' — там должны стоять одинаковые версии.
Ну и, разумеется, чтобы решить проблему выборок, можно воспользоваться VIEW. Впрочем,
insert_method=last там, конечно же, нету.
Неактивен
Таблицы идентичны, обе MyISAM, делал я их сам на одном сервере, поэтому и версия у них идентична...что ж, пойду обновлять сервер спасибо за советы
Неактивен
Какая версия сервера то? Расскажете, чем дело закончится?
Неактивен
Версия 5.1.33 - community, та же проблема
Неактивен
Попробуйте на обеих табличках принудительно сделать ALTER TABLE tablename ENGINE=MyISAM.
Это заодно сконвертирует их в последний формат. И пересоздайте над ними MERGE.
Неактивен
Бесполезно....
Неактивен
Даже не знаю, что посоветовать... я просто запускаю кусок Вашего кода, и он работает.
Попробуйте создать отдельную базу, запустить в ней приведенный Вами код и сделать
выборку из соответствующих таблиц (пустых), потом заполнить их частично данными и
снова сделать выборку. Кажется, что дело в чем-то еще.
Неактивен
Да странно...я даже пробывал пример из учебника переписать, всё равно одна и та же ошибка.
Create table tb1 (id int not null auto_increment primary key,
name char(20));
Create table tb2 (id int not null auto_increment primary key,
name char(20));
Insert into tb1 (name) values ('12'), ('34');
Insert into tb2 (name) values ('15'), ('21');
Create table total (id int not null auto_increment,
name char(20), index(id))
engine=merge union=(tb1,tb2);
Неактивен
Мммм... какая ОС? Какие-то лимиты стоят на стороне системы, может быть?
UPD: Кстати, в примере «из учебника» лишние индексы, они все равно над merge-таблицами не строятся.
С другой стороны, они не мешают...
[celestia] root test > Create table tb1 (id int not null auto_increment primary key, name char(20)); Query OK, 0 rows affected (0.05 sec) [celestia] root test > Create table tb2 (id int not null auto_increment primary key, name char(20)); Query OK, 0 rows affected (0.00 sec) [celestia] root test > Insert into tb1 (name) values ('12'), ('34'); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 [celestia] root test > Insert into tb2 (name) values ('15'), ('21'); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 [celestia] root test > Create table total (id int not null auto_increment, name char(20), index(id)) engine=merge union=(tb1,tb2); Query OK, 0 rows affected (0.01 sec) [celestia] root test > select * from total; +----+------+ | id | name | +----+------+ | 1 | 12 | | 2 | 34 | | 1 | 15 | | 2 | 21 | +----+------+ 4 rows in set (0.00 sec)
Неактивен
ОС-Windows XP, права администратора, поэтому ограничений нет...что-то еще может мешать???
Может конфликтовать с какими-либо программами?
Неактивен
Мда, виндоус под руками нету, чтобы попробовать.
Последнее предположение: без индекса пробовали MERGE создать?
Неактивен
а на UNIXе, значит, работает...
Неактивен
Ну в общем даже без индексов она не создаётся...Но всё же, спасибо за помощь! *THUMBS UP*
Неактивен
А еще вопрос...Если открыть созданную таблицу tablename.mrg при помощи notepad, что она должна содержать? Или нет такой информации? Просто у меня это:
1.tablename1
2.tablename2
Неактивен
Боюсь, что идеи иссякли
Попробуйте сделать то же самое через представления / partitioning. Хоть какая-то замена.
Неактивен
Она содержит названия таблиц, которые в нее включены, да. Только без цифр в начале.
Неактивен
ну цифры это из-за notepad2, они там автоматически строчки считают...
а вот что значит / partitioning я себе слабо представляю...судя по названию - разделение чего-то?
Неактивен
Я расстроен, Вы меня обманули
Не поленился, поставил на Windows сервер со стандартными настройками. Вот лог:
mysql> \s -------------- C:\Program Files\MySQL\MySQL Server 5.1\bin\mysql.exe Ver 14.14 Distrib 5.1.33, for Win32 (ia32) Connection id: 1 Current database: Current user: root@localhost SSL: Not in use Using delimiter: ; Server version: 5.1.33-community MySQL Community Server (GPL) Protocol version: 10 Connection: localhost via TCP/IP Server characterset: utf8 Db characterset: utf8 Client characterset: utf8 Conn. characterset: utf8 TCP port: 3306 Uptime: 16 sec Threads: 1 Questions: 4 Slow queries: 0 Opens: 15 Flush tables: 1 Open tabl es: 8 Queries per second avg: 0.250 -------------- mysql> use test; Database changed mysql> Create table tb1 (id int not null auto_increment primary key, -> name char(20)); Query OK, 0 rows affected (0.02 sec) mysql> Create table tb2 (id int not null auto_increment primary key, -> name char(20)); Query OK, 0 rows affected (0.00 sec) mysql> Insert into tb1 (name) values ('12'), ('34'); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> Insert into tb2 (name) values ('15'), ('21'); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> Create table total (id int not null auto_increment, -> name char(20), index(id)) -> engine=merge union=(tb1,tb2); Query OK, 0 rows affected (0.00 sec) mysql> select * from total; ERROR 1168 (HY000): Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist mysql> show table status like 'tb1'\G *************************** 1. row *************************** Name: tb1 Engine: InnoDB Version: 10 Row_format: Compact Rows: 2 Avg_row_length: 8192 Data_length: 16384 Max_data_length: 0 Index_length: 0 Data_free: 4194304 Auto_increment: 3 Create_time: 2009-04-10 00:46:32 Update_time: NULL Check_time: NULL Collation: utf8_general_ci Checksum: NULL Create_options: Comment: 1 row in set (0.03 sec) mysql> alter table tb1 engine=myisam; Query OK, 2 rows affected (0.03 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> alter table tb2 engine=myisam; Query OK, 2 rows affected (0.01 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> select * from total; +----+------+ | id | name | +----+------+ | 1 | 12 | | 2 | 34 | | 1 | 15 | | 2 | 21 | +----+------+ 4 rows in set (0.00 sec)
Неактивен
ааааааааа прошу прощения, действительно проблема в моей невнимательности...
Но я честно менял InnoDB на MyISAM...
Спасибо большое, всё получилось, а то неделю с мертвой точки сдвинуться не мог.
Поражаюсь вашей "упертости" в хорошем смысле этого слова и работоспособности!
Еще раз спасибо!
Неактивен