Вопрос

У меня есть таблица, которая должна отслеживать дни и затраты на доставку товара от одного поставщика другому.Мы (блестяще: p) сохранили обоих поставщиков доставки (FedEx, UPS) с поставщиками обработки продукции (подумайте сами...Дандер Миффлин) в таблице "ПОСТАВЩИК".Итак, у меня есть три столбца в моей таблице 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).

Это было полезно?

Решение

Вы дважды определили первичный ключ.Попробуй:

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;

Первичный ключ ПОСТАВЩИКА должен быть INT(6), и обе таблицы должны иметь тип InnoDB.

Другие советы

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

Можете ли вы дать определение Стол поставщика

Я догадался об этом.Таблицей ПОСТАВЩИКОВ был MyISAM...(отредактировал ваш ответ, чтобы сказать мне сделать их оба INNODB ;) )

(любая причина нет просто переключить тип ПОСТАВЩИКА на INNODB?)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top