2012-04-13 58 views
0

美好的一天每个表有四个外键不能引用主表中的单个主键

我试图解决三个表之间的外键关系问题。基本上我有两个次表,每一个都有两个外键和每个外键是参照在第三表中的单个主键。

同样的问题发生在一个更大的数据库,但由于其复杂性,规模和可能的版权问题。我只好找出问题,并创建一个副本会导致同样的问题。但是,如果你一定要知道,引用主表People相同的两个表只是两个数十个同种有问题的数据库的宇宙。

我的希望是有人可以指出问题,也许提供的解决方案不会影响当前的结构,所以我可以自己将它应用到所有其他表,因为从我看到的数据库它可能会遭受同样的问题。数据库的作者是不是我的,仅看图表时,增加一个人的困惑。

的SQL脚本创建:

CREATE SCHEMA IF NOT EXISTS `sampleBD` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ; 
USE `sampleBD` ; 

-- ----------------------------------------------------- 
-- Table `sampleBD`.`People` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `sampleBD`.`People` (
    `PeopleID` INT NOT NULL AUTO_INCREMENT , 
    `Name` VARCHAR(200) NOT NULL , 
    `EntryDate` DATETIME NULL , 
    `EntryBy` INT NULL , 
    PRIMARY KEY (`PeopleID`)) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `sampleBD`.`PeopleNumberId` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `sampleBD`.`PeopleNumberId` (
    `PeopleNumberIdID` INT NOT NULL AUTO_INCREMENT , 
    `PeopleID` INT NOT NULL , 
    `NumberId` INT(11) NOT NULL , 
    `EntryDate` DATETIME NULL , 
    `EntryBy` INT NULL , 
    PRIMARY KEY (`PeopleNumberIdID`) , 
    INDEX `PeopleID` (`PeopleID` ASC) , 
    INDEX `EntryBy` (`EntryBy` ASC) , 
    CONSTRAINT `PeopleID` 
    FOREIGN KEY (`PeopleID`) 
    REFERENCES `sampleBD`.`People` (`PeopleID`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `EntryBy` 
    FOREIGN KEY (`EntryBy`) 
    REFERENCES `sampleBD`.`People` (`PeopleID`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `sampleBD`.`PeopleCbi` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `sampleBD`.`PeopleCbi` (
    `PeopleCbiID` INT NOT NULL AUTO_INCREMENT , 
    `PeopleID` INT NOT NULL , 
    `Cbi` INT NOT NULL , 
    `EntryDate` DATETIME NULL , 
    `EntryBy` INT NULL , 
    PRIMARY KEY (`PeopleCbiID`) , 
    INDEX `PessoaID` (`PeopleID` ASC) , 
    INDEX `EntryBy` (`EntryBy` ASC) , 
    CONSTRAINT `PessoaID` 
    FOREIGN KEY (`PeopleID`) 
    REFERENCES `sampleBD`.`People` (`PeopleID`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `EntryBy` 
    FOREIGN KEY (`EntryBy`) 
    REFERENCES `sampleBD`.`People` (`PeopleID`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

脚本能够创建第一和第二表,但是当它到达第三个表则返回错误代码。

Error Code: 1005. Can't create table 'samplebd.peoplecbi' (errno: 121) 

这是一个外键问题,但我不确定如何修改它的表格或表格的当前结构。

感谢您的帮助。

+1

可能重复的 sarwar026 2012-04-13 17:44:02

+1

@ sarwar026:谢谢。它提供了一个新的MySql命令,这对于将来的参考很有用。 – 2012-04-13 17:51:01

回答

1

这看起来像外键约束名之间的名称冲突。约束名称在数据库中必须是唯一的,例如表名。

所以才选择另一个名字在第三表上的约束EntryBy。它不会影响你的任何功能。

+0

我的印象中,约束名称必须是唯一的一个表中,而不是在整个数据库。现在就解释这一切。谢谢。此解决方法将无缝工作。 – 2012-04-13 17:49:11

相关问题