首页 > 解决方案 > 我正在尝试使用具有可变 FK 的模式创建表(订单)

问题描述

地区(地区代码,地区名称)

客户(CustCode、CustName、CustAdress、CustBalance、RegionCode)

EmployeeType ( EmployeeType , HourlyPayRate,)

员工(员工编号、员工姓名、员工地址、区域代码、员工类型)

产品(ProductCode、ProductName、UnitPrice、StockOnHand)

订单(OrderNo、CustCode、ProductCode、QtyOrdered、EmployeeNo)

主键以粗体显示。

区域由 RegionCode 唯一标识。每个客户都由一个 CustCode 唯一标识。每个客户可以订购多个产品,每个产品可以有多个客户。每个 Order 由一个员工处理,一个 Employee 可以处理多个 Order

我很困惑,因为我不明白粗体的陈述是否表明它是一个复合键(OrderNo,EmployeeNo),或者它是否会分散问题的注意力?

这是我从Order模式创建表的方法

Create Table Order{
     OrderNo INT (11) AUTO INCREMENT NOT NULL PRIMARY KEY,
     FOREIGN KEY CustCode REFERENCES Customer(CustCode)
     ON DELETE CASCADE
     ON UPDATE CASCADE,
     FOREIGN KEY ProductCode REFERENCES Product(ProductCode)
     ON DELETE CASCADE
     ON UPDATE CASCADE,
     QtyOrdered int (100),
     FOREIGN KEY EmployeeNo REFERENCES Employee(EmployeeNo)
     ON DELETE CASCADE
     ON UPDATE CASCADE
}

我想知道这是否是解决这个问题的正确方法?

标签: mysqlsqlforeign-keysschemacreate-table

解决方案


你对问题的理解是可以的。您的老师希望您在Order表中具有引用表的列CustomerEmployee并且Product

但是,您的代码有缺陷。您需要声明 column,然后是外键。声明外键不会自动创建列。

其他问题:

  • 表声明用括号括起来(),而不是{}

  • Order是 MySQL(和所有其他 RDBMS)中的保留字;您需要用反引号括起来(更明智的解决方案是为该表选择另一个名称)

考虑:

Create Table `Order`(
    OrderNo INT (11) AUTO INCREMENT NOT NULL PRIMARY KEY,
    CustCode INT,
    ProductCode INT,
    QtyOrdered INT(100),
    EmployeeNo INT,
    FOREIGN KEY CustCode REFERENCES Customer(CustCode) 
        ON DELETE CASCADE ON UPDATE CASCADE,
    FOREIGN KEY ProductCode REFERENCES Product(ProductCode) 
        ON DELETE CASCADE ON UPDATE CASCADE,
    FOREIGN KEY EmployeeNo REFERENCES Employee(EmployeeNo) 
        ON DELETE CASCADE ON UPDATE CASCADE
);

旁注:外键列必须与引用列具有相同的数据类型;我假设INT对于所有这些列,您可能希望根据您的真实架构来修复它。


推荐阅读