【问题标题】:foreign key with composite primary key具有复合主键的外键
【发布时间】:2013-06-24 10:49:00
【问题描述】:

一个表有一个列引用另一个作为复合主键的表列。 我该如何为此编写查询? 它显示了这个错误。我该如何解决它。

错误 1050:无法创建表 'recdesk.#sql-5e8_33'(错误号:150)

SQL 语句:

ALTER TABLE `recdesk`.`facility`
  CHANGE COLUMN `organization_id` `organization_id` INT(11) NOT NULL DEFAULT 0,
  CHANGE COLUMN `facility_id` `facility_id` INT(11) NOT NULL DEFAULT 0, 

  ADD CONSTRAINT `fk_organization_id`
  FOREIGN KEY (`organization_id` )
  REFERENCES `recdesk`.`facility_type` (`organization_id` )
  ON DELETE RESTRICT
  ON UPDATE RESTRICT, 

  ADD CONSTRAINT `fk_facility_type_id`
  FOREIGN KEY (`facility_type_id` )
  REFERENCES `recdesk`.`facility_type` (`facility_type_id` )
  ON DELETE RESTRICT
  ON UPDATE RESTRICT

, ADD INDEX `fk_organization_id_idx` (`organization_id` ASC) 
, ADD INDEX `fk_facility_type_id_idx` (`facility_type_id` ASC)


ERROR: Error when running failback script. Details follow.

ERROR 1050: Table 'facility' already exists

SQL Statement:

CREATE TABLE `facility` (
  `organization_id` int(11) NOT NULL,
  `facility_id` int(11) NOT NULL,
  `name` varchar(50) DEFAULT NULL,
  `address_line1` varchar(50) DEFAULT NULL,
  `address_line2` varchar(50) DEFAULT NULL,
  `city` varchar(30) DEFAULT NULL,
  `state` varchar(2) DEFAULT NULL,
  `zip_code` varchar(9) DEFAULT NULL,
  `description` varchar(1000) DEFAULT NULL,
  `note` varchar(250) DEFAULT NULL,
  `capacity` smallint(6) DEFAULT NULL,
  `show_on_portal` char(1) DEFAULT NULL,
  `active_indicator` char(1) DEFAULT NULL,
  `primary_facility_indicator` char(1) DEFAULT NULL,
  `facility_type_id` int(11) DEFAULT NULL,
  `parent_facility_id` int(11) DEFAULT NULL,
  `create_date` datetime DEFAULT NULL,
  `show_schedule_on_portal` char(1) DEFAULT NULL,
  `show_usage_on_portal` char(1) DEFAULT NULL,
  `enable_online_reservation` char(1) DEFAULT NULL,
  `gl_code_id` int(11) DEFAULT NULL,
  `gl_code_deposit_id` int(11) DEFAULT NULL,

  PRIMARY KEY (`organization_id`,`facility_id`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1

【问题讨论】:

  • 如果引用的主键是复合的,那么引用的键也应该是复合的

标签: mysql sql


【解决方案1】:

如果表Facility中的列(Organization_ID, Facility_ID)是表Facility_Type中列(Organization_ID, Facility_ID)的外键引用,并且这是Facility_Type中的唯一键,那么你需要创建单个外键约束:

ALTER TABLE `recdesk`.`facility`
  CHANGE COLUMN `organization_id` `organization_id` INT(11) NOT NULL DEFAULT 0,
  CHANGE COLUMN `facility_id` `facility_id` INT(11) NOT NULL DEFAULT 0, 

  ADD CONSTRAINT `fk_facility_type`
  FOREIGN KEY (`organization_id`, `facility_type`)
  REFERENCES `recdesk`.`facility_type` (`organization_id`, `facility_type`)
  ON DELETE RESTRICT
  ON UPDATE RESTRICT, 

  ADD INDEX `fk_facility_type_idx` (`organization_id` ASC, `facility_type` ASC)

这是推断语法,未经测试,但它应该接近您的需要,假设 MySQL 中没有禁止复合外键的意外限制。

这个概念是您需要一个外键引用来指定Facility 表中引用被引用表中匹配列的两个列。索引还需要在一对列上,而不是在单个列上。

【讨论】:

    【解决方案2】:

    错误是

    ERROR 1050: Table 'facility' already exists

    您需要在执行创建脚本之前删除表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-02
      • 2013-04-30
      • 2020-02-19
      • 1970-01-01
      • 1970-01-01
      • 2018-04-07
      • 1970-01-01
      • 2013-06-29
      相关资源
      最近更新 更多