我有一张表,用于跟踪将产品从一个供应商运送到另一个供应商的天数和成本。我们(非常出色:p)将运输供应商(FedEx、UPS)与产品处理供应商(想想...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'(errno: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;

VENDOR 主键必须是 INT(6),并且两个表都必须是 InnoDB 类型。

其他提示

我在这里运行了代码,错误消息显示(这是正确的!)您正在设置 ID 字段作为主键的两倍。

您能提供供应商表的定义吗

我想到了。VENDOR 表是 MyISAM...(编辑你的答案告诉我让它们都是 INNODB ;))

(任何原因 不是 只是将 VENDOR 类型切换为 INNODB?)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top