Несколько внешних ключей?
У меня есть таблица, которая должна отслеживать дни и затраты на доставку продукта от одного поставщика к другому. Мы (блестяще: 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;
Отредактировано для удаления определения двойного первичного ключа...
Да, к сожалению, это не исправить. Теперь я получаю:
Невозможно создать таблицу './REMOVED MY DB NAME/SHIPPING_GRID.frm' (errno: 150)
Выполнение phpinfo() говорит мне об этом для mysql:
Клиентский API версии 5.0.45
Да, VENDOR.no - это тип int (6).
Ответы
Ответ 1
Вы определили первичный ключ дважды. Попробуйте:
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.
Ответ 2
Я запустил код здесь, и сообщение об ошибке показало (и правильно!), что вы дважды устанавливаете поле id в качестве первичного ключа.
Ответ 3
Можете ли вы дать определение Таблица VENDOR
Я понял это. Таблица VENDOR была MyISAM... (отредактировал ваш ответ, чтобы сказать мне, чтобы сделать их как INNODB;))
(любая причина не просто переключать тип VENDOR на INNODB?)