2012-01-08 2 views
0

Интересно, может ли кто-нибудь мне помочь.Удалить несколько каскадных таблиц

У меня есть следующие три таблицы:

Родитель Таблица

CREATE TABLE `userdetails` (
    `userid` int(6) NOT NULL auto_increment, 
    `forename` varchar(20) NOT NULL, 
    `surname` varchar(30) NOT NULL, 
    `emailaddress` varchar(150) NOT NULL, 
    `password` varchar(200) NOT NULL, 
    `passwordhint` varchar(20) NOT NULL, 
    `subscriptionexpiration` date NOT NULL, 
    `salt` varchar(200) NOT NULL, 
    PRIMARY KEY (`userid`), 
    UNIQUE KEY `emailaddress` (`emailaddress`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

Детский стол

CREATE TABLE `detectinglocations` (
    `userid` int(6) NOT NULL, 
    `locationid` int(6) NOT NULL auto_increment, 
    `locationname` varchar(80) NOT NULL, 
    `address` varchar(110) NOT NULL, 
    `osgb36lat` float(10,6) NOT NULL, 
    `osgb36lon` float(10,6) NOT NULL, 
    `osgridref` varchar(20) NOT NULL, 
    `wgs84latd` int(2) NOT NULL, 
    `wgs84latm` int(2) NOT NULL, 
    `wgs84lats` decimal(6,2) NOT NULL, 
    `wgs84latb` varchar(1) NOT NULL, 
    `wgs84lond` int(2) NOT NULL, 
    `wgs84lonm` int(2) NOT NULL, 
    `wgs84lons` decimal(6,2) NOT NULL, 
    `wgs84lonb` varchar(1) NOT NULL, 
    `nameoflocationcontact` varchar(30) NOT NULL, 
    `locationcontactsaddressline1` varchar(50) NOT NULL, 
    `locationcontactsaddressline2` varchar(50) default NULL, 
    `locationcontactsaddressline3` varchar(50) default NULL, 
    `locationcontactsaddressline4` varchar(50) default NULL, 
    `locationcontactstelephonenumber` varchar(15) default NULL, 
    PRIMARY KEY (`locationid`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

Детский стол

Используя этот код ниже, я пытаюсь реализовать функциональность «Удалить каскад», в результате чего, если пользователь удален из родительской таблицы, связанные строки в дочерних таблицах будут удалены.

ALTER TABLE 'tablename' 
    add CONSTRAINT fk_userdetails 
    FOREIGN KEY (userid) 
    REFERENCES userdetails(userid) 
    ON DELETE CASCADE 

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

#1005 - Can't create table './db369054642/#sql-30d_bd1a57.frm' (errno: 121) 

я сделал довольно немного исследований, чтобы выяснить, в чем проблема, но я должен признать, что я не мудрее.

Может кто-нибудь, возможно, взглянуть на это, пожалуйста, и дайте мне знать, что я делаю неправильно?

Большое спасибо

ответ

0

Решение о http://dev.mysql.com/doc/refman/5.0/en/innodb-error-codes.html в должности Марк Robbins 29 сентября 2007 года 10:19 часов вечера и следующий:

  • Имена ограничений должны быть уникальными
  • fk_userdetails не уникальный

Таким образом, вы можете попробовать

ALTER TABLE 'tablename' 
    add CONSTRAINT fk_userdetails_detectors 
    FOREIGN KEY (userid) 
    REFERENCES userdetails(userid) 
    ON DELETE CASCADE 

на втором столе

+1

В любом случае не нужно указывать имя ограничения. MySQL будет создавать один автоматически. Таким образом, простая «alter table X add foreign key ...» будет работать нормально. –

+0

Так оно и есть, но удобное для чтения и понятное имя может быть предпочтительным. –

+0

не очень. Имя ограничения имеет смысл только в том случае, если вы его отбрасываете или изменяете, и его можно легко получить из вызова show show table X. –

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