Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
привет всем
может ктото подскажет пожалуйста почему не отрабатывает такой запрос
create table info(id varchar(32) not null) engine=innodb;
create table user(id integer not null auto_increment primary key)engine=innodb;
alter table user add info_id varchar(32);
alter table user add foreign key (info_id) references info(Id);
последний альтер выдает ошибку... хотя если делать все это же для mssql то все отлично!
Неактивен
Нужно еще сделать
alter table info add index(id) - innodb требует наличия индекса на колонке отношения.
Неактивен
да, действительно в данном случае запрос будет так отрабатывать.... но оказалось что проблема глубже.
Я использую такие запросы
create table vk_host_scsi_lun (Id bigint not null auto_increment, HostId bigint not null, DeviceName varchar(200) not null, CanonicalName varchar(100)
not null, Uuid varchar(100) not null, primary key (Id)) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS vk_disk_type (Id varchar(32) not null, Name varchar(50), ReadBW bigint, WriteBW bigint, Custom bit, primary key (Id))
ENGINE=InnoDB;
alter table vk_disk_type add index vk_disk_type_fk1 (Id);
alter table vk_host_scsi_lun add DiskTypeId varchar(32);
alter table vk_host_scsi_lun add index vk_host_scsi_lun_fk2 (DiskTypeId);
alter table vk_host_scsi_lun add constraint vk_host_scsi_lun_fk2 foreign key (DiskTypeId) references vk_disk_type (Id);
если их выполнить на чистой базе то все отработает, но почему то не отрабатывает если пытаюсь мигрировать старую базу такими запросами
CREATE TABLE IF NOT EXISTS vk_disk_type (Id varchar(32) not null, Name varchar(50), ReadBW bigint, WriteBW bigint, Custom bit, primary key (Id))
ENGINE=InnoDB;
alter table vk_disk_type add index vk_disk_type_fk1 (Id);
alter table vk_host_scsi_lun add DiskTypeId varchar(32);
alter table vk_host_scsi_lun add index vk_host_scsi_lun_fk2 (DiskTypeId);
alter table vk_host_scsi_lun add constraint vk_host_scsi_lun_fk2 foreign key (DiskTypeId) references vk_disk_type (Id);
т.е. таблица vk_host_scsi_lun уже есть и в ней еще есть связи и данные.
Изза чего такое возможно.. не могу понять
Неактивен
Приведите, пожалуйста, сами ошибки - очень тяжело пытаться сообразить, где происходит
ошибка и какая
Неактивен
возникает
ERROR 1005 (HY000): Can't create table '.\vk\#sql-590_2.frm' (errno: 150)
только после
alter table vk_host_scsi_lun add constraint vk_host_scsi_lun_fk2 foreign key (DiskTypeId) references vk_disk_type (Id);
Неактивен
Просто интерес в том, что эту схему создания базы делает хибернейт.. оно то отрабатывает, но только на создание базы... а если я хочу добавить еще одну таблицу (потом когда таблицы уже заполнены,... хотя даже если их почистить тоже не пашет) vk_disk_type и свзяь с vk_host_scsi_lun то не работает!
Может быть ли это связано с какими то другимим связями которые есть в vk_host_scsi_lun?
Неактивен
А таблица vk_disk_type уже есть? IF NOT EXISTS может очень здорово испортить Вам импорт...
alter table vk_host_scsi_lun add index vk_host_scsi_lun_fk2 (DiskTypeId);
Вот этот запрос, вроде, лишний - на эту же таблицу индекс создастся сам.
Просто если наличие данных не дает создать таблицу (а без данных все создается), то значит,
дело в конфликтующих данных. Пустая таблица не может конфликтовать данными. Следовательно,
она не пустая. Я прав?
Неактивен
Я проверил, без IF NOT EXISTS всеравно та же ошибка.
Таблицы vk_disk_type нет до этого.
И таблицы пустые.
mysql> CREATE TABLE vk_disk_type (Id varchar(32) not null, Name varchar(50), Rea
dBW bigint, WriteBW bigint, Custom bit, primary key (Id)) ENGINE=InnoDB;
Query OK, 0 rows affected (0.00 sec)
mysql> alter table vk_disk_type add index (Id);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> alter table vk_host_scsi_lun add DiskTypeId varchar(32);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> alter table vk_host_scsi_lun add index vk_host_scsi_lun_i2 (DiskTypeId);
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> alter table vk_host_scsi_lun add foreign key (DiskTypeId) references vk_d
isk_type (Id);
ERROR 1005 (HY000): Can't create table '.\vk\#sql-590_2.frm' (errno: 150)
mysql> select * from vk_disk_type;
Empty set (0.00 sec)
mysql> select * from vk_host_scsi_lun;
Empty set (0.00 sec)
просто если нет больше никаких таблиц и связей то эти запросы отрабатывают, а если есть еще связи с vk_host_scsi_lun то не отрабатывает
Неактивен
Для пустых табличек проходит:
mysql> create table vk_host_scsi_lun (id int) engine=innodb; Query OK, 0 rows affected (0.03 sec) mysql> CREATE TABLE vk_disk_type (Id varchar(32) not null, Name varchar(50), ReadBW bigint, WriteBW bigint, Custom bit, primary key (Id)) ENGINE=InnoDB; Query OK, 0 rows affected (0.05 sec) mysql> alter table vk_disk_type add index (Id); Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> alter table vk_host_scsi_lun add DiskTypeId varchar(32); Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> alter table vk_host_scsi_lun add index vk_host_scsi_lun_i2 (DiskTypeId); Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> alter table vk_host_scsi_lun add foreign key (DiskTypeId) references vk_disk_type (Id); Query OK, 0 rows affected (0.05 sec) Records: 0 Duplicates: 0 Warnings: 0
Может быть, первая табличка у Вас не InnoDB?
Неактивен
Точно InnoDB.
Как оказалось - база не смигрирует если её сначала сдампить , потом развернуть.
Потом уже миграция не пройдет!
Как можно это объяснить?
Неактивен
Насколько мне известно, проблема импорта-экспорта с внешними ключами тяжела
в любых СУБД. Единственное разумное решение - отключать на время импорта
индексы (ALTER TABLE tablename DISABLE INDEX), импорт данных, и включение
индексов (ENABLE INDEX). Стандартные дампы поддерживают disable-enable на
уровне единичных таблиц. Вроде бы, такого должно хватать, но кто знает...
По поводу Вашей ошибки:
1. Какая у Вас версия MySQL?
2. Зайдите все-таки в каталог с данными и убедитесь, что там есть только файлы
*.frm (и, возможно, *.ibd) - важно, чтобы не было файлов *.MYD и *.MYI.
Неактивен
Страниц: 1