2009-10-16 2 views
0

Я сталкиваюсь с несколькими проблемами при попытке создания внешних ключей для своих таблиц в MySql (Innodb). Не могли бы вы помочь мне с ними?mysql (innodb) проблемы с ограничениями внешнего ключа

Ссылочные таблицы:

*create table entity 
{ 
    PID INT(20) auto inc not null, 
    ENTITYID INT(20) not null, 
    details VARCHAR(100) not null, 
    primary key(PID,ENTITYID) 
} 
create table user 
{ 
USERID int(20) auto inc not null, 
NAME VARCHAR(45) not null, 
joindate DATETIME not null, 
location VARCHAR(100) not null, 
primary key(USERID,NAME) not null 
}* 

Referencing table: 
*create table C 
{ 
    ENTITYID INT(20) not null, 
    NAME VARCHAR(45) not null, 
    foreign key ENTITYID_C constraint ENTITYID references entity(ENTITYID) on delete cascade, 
    foreign key name_C constraint NAME references user(NAME) on delete cascade, 
    primary key(ENTITYID,NAME) 
}* 

мне нужно 2 внешних ключей в таблице С, так как запись в C должны быть удалены, когда либо соответствующий орган или соответствующий пользователь будет удален.

Когда я пытаюсь создать таблицу C Я столкнулся с ошибкой: ERROR 1005: Не удается создать таблицу (errno: 150). Я подозреваю, что это связано с тем, что я не придерживаюсь правил, изложенных в спецификации mysql. http://dev.mysql.com/doc/refman/5.4/en/innodb-foreign-key-constraints.html

Что означает нижняя часть/правило спецификации?

«InnoDB требует индексов на внешних ключах и ссылочных ключах, чтобы проверки внешнего ключа могли быть быстрыми и не требовать сканирования таблицы. В таблице ссылок должен быть индекс, в котором столбцы внешнего ключа перечислены в качестве первого столбцы в том же порядке ».

Означает ли это, что внешние ключи в таблице C должны соответствовать первичным ключам в суставах и пользовательских таблицах, так что ENTITYID в таблице сущностей должен быть первым в первичном ключе, а NAME в таблице пользователя должен быть первым в первичный ключ. Другими словами, должны ли мои первичные ключевые слова быть переписаны, как показано ниже?

entity table --> primary key(ENTITYID,PID) , 
user table --> primary key(NAME,USERID) 

Если да, то когда я попытка реорганизовать ключевые декларации, как указано выше я бегу в ошибки 1075. «Некорректное определение таблицы, может быть только одна автоматическая колонка и она должна быть определена в качестве ключа.»

Как я могу сделать ключ с автоматическим добавлением (ключ суррогата) вторым в списке индексных указателей, чтобы я соответствовал спецификации?

Спасибо!

ответ

1

Я не думаю, что ваши первичные ключи для сущности и пользователя верны. Я считаю, что первичный ключ и индексы перепутаны.

У вас есть автоинкрементные столбцы для обеих таблиц. Я думаю, что это должны быть первичные ключи - PID для ENTITY, USERID для USER. Если вы запрашиваете ENTITY, используя ENTITYID или USER, используя NAME, обязательно создавайте индексы для обоих.

Теперь таблица C определяет отношение «многие ко многим» между ENTITY и USER. В C есть два столбца, которые указывают на PID и USERID, с внешними ключами для каждого. Первичный ключ на C - это комбинация двух.

Как это:

create table entity 
{ 
    pid int(20) auto inc not null, 
    primary key(pid) 
}; 

create table user 
{ 
    userid int(20) auto inc not null, 
    primary key(userid) 
}; 

create table user_entity 
{ 
    entity_id int(20) not null, 
    user_id int(20) not null, 
    primary key(entity_id, user_id) 
    foreign key entity_id references entity(pid) on delete cascade, 
    foreign key user_id references user(userid) on delete cascade 
}; 
+0

Спасибо за Ваше сообщение! Я переделываю свои таблицы, чтобы избежать этих проблем. – user190914

0

Всякий раз, когда я сделал это, я определенно, определенно нашел, что это лучше, чтобы определить все таблицы, а затем применить Сдерживает с отдельными запросами ALTER позже. Вы избегаете так много «мне нужна эта таблица, чтобы существовать в первую очередь» и тому подобное.

1

Ollie Saunders является правильным. Перед тем, как отбросить/создать таблицы InnoDB, сначала отбросьте все ограничения.

ALTER TABLE tbl_name 
    ADD [CONSTRAINT [symbol]] FOREIGN KEY 
    [index_name] (index_col_name, ...) 
    REFERENCES tbl_name (index_col_name,...) 
    [ON DELETE reference_option] 
    [ON UPDATE reference_option] 

Источник: Alter table syntax

Смежные вопросы