2013-06-24 178 views
1

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

错误1050:无法创建表(错误:150) 'recdesk#SQL-5e8_33。'

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 
+3

如果引用的主键是合成的,则引用键也应该是合成的 –

回答

0

的错误是

ERROR 1050: Table 'facility' already exists

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

3

如果表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表中引用引用表中的匹配列的两列。索引还需要在一对列上,而不是在一列上。