Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
运行脚本时出现MySQL错误";无法添加外键约束";_Mysql_Sql - Fatal编程技术网

运行脚本时出现MySQL错误";无法添加外键约束";

运行脚本时出现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

我使用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 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上存在分歧的可能性

有时数据库被有意地非规范化,通常是出于性能原因,但我在这里看不到任何理由。

可能重复的