Несколько внешних ключей?

У меня есть таблица, которая должна отслеживать дни и затраты на доставку товара от одного поставщика другому. Мы (блестяще: p) сохранили обоих поставщиков (FedEx, UPS) вместе с поставщиками продуктов (Think ... Dunder Mifflin) в таблице "VENDOR". Итак, у меня есть три столбца в моей таблице SHIPPING_DETAILS, которые все ссылаются на VENDOR.no. По какой-то причине MySQL не позволяет мне определять все три как внешние ключи. Есть идеи?

CREATE TABLE SHIPPING_GRID(  
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'Unique ID for each row',  
    shipping_vendor_no INT(6) NOT NULL COMMENT 'Foreign key to VENDOR.no for the shipping vendor (vendors_type must be 3)',  
    start_vendor_no INT(6) NOT NULL COMMENT 'Foreign key to VENDOR.no for the vendor being shipped from',  
    end_vendor_no INT(6) NOT NULL COMMENT 'Foreign key to the VENDOR.no for the vendor being shipped to',  
    shipment_duration INT(1) DEFAULT 1 COMMENT 'Duration in whole days shipment will take',  
    price FLOAT(5,5) NOT NULL COMMENT 'Price in US dollars per shipment lbs (down to 5 decimal places)',  
    is_flat_rate TINYINT(1) DEFAULT 0 COMMENT '1 if is flat rate regardless of weight, 0 if price is by lbs',  
    INDEX (shipping_vendor_no),  
    INDEX (start_vendor_no),  
    INDEX (end_vendor_no),  
    FOREIGN KEY (shipping_vendor_no) REFERENCES VENDOR (no),  
    FOREIGN KEY (start_vendor_no) REFERENCES VENDOR (no),  
    FOREIGN KEY (end_vendor_no) REFERENCES VENDOR (no)  
) TYPE = INNODB;

Отредактировано для удаления двойного определения первичного ключа ...


Да, к сожалению, это не исправило это все же. Теперь я получаю:

Невозможно создать таблицу './ УДАЛЕНО МОЕ ИМЯ БД /SHIPPING_GRID.frm' (номер ошибки: 150)

Выполнение phpinfo () говорит мне об этом для mysql:

Клиентский API версия 5.0.45

Да, VENDOR.no имеет тип int (6).

8.08.2008 20:07:43
Действительно, ошибка 150 относится к ошибке ограничения внешнего ключа . Можете ли вы дать определение таблицы VENDOR? Является ли PK VENDOR INT (6) или просто INT? На приведенной выше странице: - Размер и знак целочисленных типов должны быть одинаковыми.
Christian Lescuyer 8.08.2008 20:35:00
3 ОТВЕТА
РЕШЕНИЕ

Вы определили первичный ключ дважды. Пытаться:

CREATE TABLE SHIPPING_GRID(  
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'Unique ID for each row',  
    shipping_vendor_no INT(6) NOT NULL COMMENT 'Foreign key to VENDOR.no for the shipping vendor (vendors_type must be 3)',  
    start_vendor_no INT(6) NOT NULL COMMENT 'Foreign key to VENDOR.no for the vendor being shipped from',  
    end_vendor_no INT(6) NOT NULL COMMENT 'Foreign key to the VENDOR.no for the vendor being shipped to',  
    shipment_duration INT(1) DEFAULT 1 COMMENT 'Duration in whole days shipment will take',  
    price FLOAT(5,5) NOT NULL COMMENT 'Price in US dollars per shipment lbs (down to 5 decimal places)',  
    is_flat_rate TINYINT(1) DEFAULT 0 COMMENT '1 if is flat rate regardless of weight, 0 if price is by lbs',  
    INDEX (shipping_vendor_no),  
    INDEX (start_vendor_no),  
    INDEX (end_vendor_no),  
    FOREIGN KEY (shipping_vendor_no) REFERENCES VENDOR (no),  
    FOREIGN KEY (start_vendor_no) REFERENCES VENDOR (no),  
    FOREIGN KEY (end_vendor_no) REFERENCES VENDOR (no)  
) TYPE = INNODB;

Первичный ключ VENDOR должен быть INT (6), и обе таблицы должны иметь тип InnoDB.

10
20.05.2010 13:31:49

Я запустил здесь код, и сообщение об ошибке показало (и это правильно!), Что вы устанавливаете поле id дважды как первичный ключ.

0
8.08.2008 20:18:58

Можете ли вы дать определение таблицы VENDOR

Я понял. Таблицей VENDOR был MyISAM ... (отредактировал ваш ответ, чтобы сказать мне, чтобы сделать их обоих INNODB;))

(есть ли причина не просто переключать тип VENDOR на INNODB?)

0
11.01.2016 08:24:24