是否可以将外键引用到父表?

时间:2018-05-16 16:14:54

标签: sql postgresql

CREATE TABLE Product 
(
    "Product_id" int,
    "Stock_quantity" int,
    "Product_name" varchar(50),
    "Model" varchar(50),
    "Average_rating" float(3),
    "RAM" int,
    "Color" varchar(20),
    "Price" float(10),
    PRIMARY KEY ("Product_id")
);

CREATE TABLE Sale 
(
    "Sale_id" int,
    "Sale_date" date,
    "Employee_id" int,
    "Customer_id" int,
    "Product_id" int,
    "Product_quantity" int,
    "Rating" int,
    PRIMARY KEY ("Sale_id"),
    FOREIGN KEY("Employee_id") REFERENCES Employee("Employee_id") ,
    FOREIGN KEY("Customer_id") REFERENCES Customer("Customer_id") ,
    FOREIGN KEY("Product_id") REFERENCES Product("Product_id")
);

CREATE TABLE Computer  
(
    "Type" varchar(10),
    "Processor" varchar(20),
    "Monitor_size" int
)  inherits(Product);

CREATE TABLE Mobile 
(
    "Os" varchar(30),
    "Screen_size" int
) inherits(Product);

在插入销售行时,这是我的表格,我收到此错误。

  

错误:在表格上插入或更新" sale"违反外键约束" PK_Product_id"
  SQL状态:23503
  细节:Key(Product_id)=(12)不存在于表"产品"。

它说没有行,但是当我查看表时我可以看到它们:

However pgAdmin claims that there is no rows at table.

我将所有产品作为计算机或移动设备插入而不是产品。

1 个答案:

答案 0 :(得分:3)

你在继承的许多怪癖中磕磕绊绊:继承层次结构中没有“全局”约束,因此你不能拥有继承层次结构的外键。

您在product上定义的主键扩展为computer

即使SELECT上的product也会为继承子项附加结果,但这些不是表parent的一部分,因此不能用作外语的目标键。外键仅在saleproduct 之间,继承子项被排除在外。

使用继承没有正确的方法。

computer 而不是最好是产品的继承子,但要拥有product的外键(对其有唯一约束),所以计算机对象的数据将在两个表之间分割。这对于查询来说有点不方便,但是你可以通过这种方式获得外键。

以下是一个例子:

CREATE TABLE product (
   product_id integer PRIMARY KEY,
   prodname text NOT NULL
);

CREATE TABLE computer (
   product_id integer PRIMARY KEY,
   processor text NOT NULL,
   FOREIGN KEY (product_id) REFERENCES product(product_id)
);

CREATE TABLE sale (
   sale_id integer PRIMARY KEY,
   product_id integer NOT NULL REFERENCES product(product_id)
);

现在没有salecomputer的直接外键引用,但由于product_idcomputer的{​​{1}}相同,因此您始终可以找到product的唯一计算机(如果存在):

sale

如果您有更多产品“子类型”,则可以添加更多左连接。