运行脚本时出现MySQL错误";无法添加外键约束";
我使用MySQL Workbench创建了一个模式,将其导出为脚本,并在MySQL本地服务器上运行该脚本。除了“成员”表之外,其他一切都正常工作。当它创建此表时,出现错误1215:无法添加外键约束运行脚本时出现MySQL错误";无法添加外键约束";,mysql,sql,Mysql,Sql,我使用MySQL Workbench创建了一个模式,将其导出为脚本,并在MySQL本地服务器上运行该脚本。除了“成员”表之外,其他一切都正常工作。当它创建此表时,出现错误1215:无法添加外键约束 CREATE SCHEMA IF NOT EXISTS `endor` DEFAULT CHARACTER SET utf8 ; USE `endor` ; CREATE TABLE IF NOT EXISTS `endor`.`activity` ( `activityid` INT NOT
CREATE SCHEMA IF NOT EXISTS `endor` DEFAULT CHARACTER SET utf8 ;
USE `endor` ;
CREATE TABLE IF NOT EXISTS `endor`.`activity` (
`activityid` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(45) NULL,
PRIMARY KEY (`activityid`))
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `endor`.`resource` (
`resourceid` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(45) NULL,
`location` VARCHAR(45) NULL,
`time_checkedout` VARCHAR(45) NULL,
`activity_activityid` INT NULL,
PRIMARY KEY (`resourceid`),
INDEX `fk_resource_activity1_idx` (`activity_activityid` ASC),
CONSTRAINT `fk_resource_activity1`
FOREIGN KEY (`activity_activityid`)
REFERENCES `endor`.`activity` (`activityid`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `endor`.`treasury` (
`treasuryid` INT NOT NULL AUTO_INCREMENT,
`treasurer_name` VARCHAR(45) NULL,
PRIMARY KEY (`treasuryid`))
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `endor`.`account` (
`accountid` INT NOT NULL AUTO_INCREMENT,
`type` VARCHAR(45) NULL,
`balance` INT NULL,
`treasury_treasuryid` INT NULL,
PRIMARY KEY (`accountid`),
INDEX `fk_account_treasury1_idx` (`treasury_treasuryid` ASC),
CONSTRAINT `fk_account_treasury1`
FOREIGN KEY (`treasury_treasuryid`)
REFERENCES `endor`.`treasury` (`treasuryid`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `endor`.`member` (
`memberid` INT NOT NULL AUTO_INCREMENT,
`fname` VARCHAR(45) NULL,
`lname` VARCHAR(45) NULL,
`email` VARCHAR(45) NULL,
`type` VARCHAR(45) NULL,
`resource_resourceid` INT NULL,
`resource_activity_activityid` INT NULL,
`treasury_treasuryid` INT NULL,
`account_accountid` INT NULL,
PRIMARY KEY (`memberid`),
INDEX `fk_member_resource1_idx` (`resource_resourceid` ASC, `resource_activity_activityid` ASC),
INDEX `fk_member_treasury1_idx` (`treasury_treasuryid` ASC),
INDEX `fk_member_account1_idx` (`account_accountid` ASC),
CONSTRAINT `fk_member_resource1`
FOREIGN KEY (`resource_resourceid` , `resource_activity_activityid`)
REFERENCES `endor`.`resource` (`resourceid` , `activity_activityid`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_member_treasury1`
FOREIGN KEY (`treasury_treasuryid`)
REFERENCES `endor`.`treasury` (`treasuryid`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_member_account1`
FOREIGN KEY (`account_accountid`)
REFERENCES `endor`.`account` (`accountid`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `endor`.`accounts_payable` (
`apid` INT NOT NULL AUTO_INCREMENT,
`treasury_treasuryid` INT NULL,
PRIMARY KEY (`apid`),
INDEX `fk_accounts_payable_treasury1_idx` (`treasury_treasuryid` ASC),
CONSTRAINT `fk_accounts_payable_treasury1`
FOREIGN KEY (`treasury_treasuryid`)
REFERENCES `endor`.`treasury` (`treasuryid`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `endor`.`accounts_receivable` (
`arid` INT NOT NULL AUTO_INCREMENT,
`treasury_treasuryid` INT NULL,
PRIMARY KEY (`arid`),
INDEX `fk_accounts_receivable_treasury1_idx` (`treasury_treasuryid` ASC),
CONSTRAINT `fk_accounts_receivable_treasury1`
FOREIGN KEY (`treasury_treasuryid`)
REFERENCES `endor`.`treasury` (`treasuryid`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
FK活动\ U activityid似乎是通过资源而不是活动引用的
CONSTRAINT `fk_member_resource1`
FOREIGN KEY (`resource_resourceid` , `resource_activity_activityid`)
REFERENCES `endor`.`resource` (`resourceid` , `activity_activityid`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
尝试将上述内容更改为:
CONSTRAINT `fk_member_resource1`
FOREIGN KEY (`resource_resourceid`)
REFERENCES `endor`.`resource` (`resourceid`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_member_activity1`
FOREIGN KEY (`activity_activityid`)
REFERENCES `endor`.`activity` (`activityid`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
您正在尝试创建此外键:
CONSTRAINT `fk_member_resource1`
FOREIGN KEY (`resource_resourceid` , `resource_activity_activityid`)
REFERENCES `endor`.`resource` (`resourceid` , `activity_activityid`)
但是endor
resource
的主键只是(resourceid
)。外键不应引用非键字段
此外,您应该考虑表<代码> EndoR < /代码>。<代码>成员<代码>需要列>代码> RealthyActhVyyAcActuviyID。如果需要与被引用的
资源
行的活动_活动_id
列相同,则您的模式将因其存在而非规范化。如果您将其保留在中,那么您将保留成员和资源在适当的活动id上存在分歧的可能性
有时数据库被有意地非规范化,通常是出于性能原因,但我在这里看不到任何理由。可能重复的