2009-02-15 3 views
2

Я пытаюсь иметь 2 таблицы со скрещенными внешними ключами, но мне не разрешено ссылаться на таблицу, которая не существует, когда я их создаю. Любой способ создания таких таблиц для mysql, что-то вроде объявления обеих таблиц в одно и то же время или задержки оценки внешних ключей?Перекрестные внешние ключи в SQL

Ошибка 1005: Не удается создать таблицу blocks.frm (ERRNO 150) на MySQL 5.0

SQL:

create table if not exists blocks( 
    id int unsigned not null auto_increment, 
    title varchar(100), 
    defaultpage int unsigned not null, 
    foreign key(defaultpage) references pages(pageID), 
    primary key(id)) engine=innodb; 

create table if not exists pages( 
    pageID int unsigned not null auto_increment, 
    title varchar(50) not null, 
    content blob, 
    blockid int unsigned not null, 
    foreign key(blockid) references block(id), 
    primary key(pageID)) engine=innodb; 

Что такое правильный способ решить эту проблему?

+0

Как вы собираетесь вставить данные в таблицы во время выполнения? Кажется, что вы не можете вставлять данные в одну из таблиц, потому что в зависимости от того, что вы вставляете, сначала требуется ссылка на запись (которая еще не существует) в другой таблице. – ChrisW

+0

Хорошая точка. Я думаю, единственный вариант - использовать «вставить из select», который в этом конкретном случае воняет. Хорошим решением было бы сделать block.defaultpage нулевым. –

+0

Другим решением является добавление внешнего ключа после установки записи данных по умолчанию [s]. – ChrisW

ответ

4

Доведение ответ Клетуса (который совершенно правильно) к коду ...

create table if not exists pages( 
    pageID int unsigned not null auto_increment, 
    title varchar(50) not null, 
    content blob, 
    blockid int unsigned not null, 
    primary key(pageID)) engine=innodb; 

create table if not exists blocks( 
    id int unsigned not null auto_increment, 
    title varchar(100), 
    defaultpage int unsigned not null, 
    foreign key(defaultpage) references pages(pageID), 
    primary key(id)) engine=innodb; 

alter table pages add constraint fk_pages_blockid foreign key (blockid) references blocks (id); 
+0

К плохой cletus уже удалил свой ответ. Было бы еще одним +1 от меня. – Tomalak

0

Вы можете задержать внешнего ключа проверки, пока не будут создаваться таблицы:

SET FOREIGN_KEY_CHECKS = 0; 
CREATE TABLE ...; 
SET FOREIGN_KEY_CHECKS = 1;