2013-06-24 3 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

Если пара колонка (Organization_ID, Facility_ID) в таблице Facility является внешним ключом ссылки на пары столбцов (Organization_ID, Facility_ID) в таблице Facility_Type, и это является уникальным ключом в 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) 

Это Inferred синтаксис, проверялось, но это должно быть близко к тому, что вам нужно, если предположить, нет никаких неожиданных ограничений в MySQL, которые запрещают сложные внешние ключи.

Концепция заключается в том, что вам нужна ссылка с одним внешним ключом, которая указывает оба столбца в таблице Facility, которые ссылаются на соответствующие столбцы в ссылочной таблице. Индекс также должен находиться в паре столбцов, а не в одном столбце.