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)不存在于表"产品"。
它说没有行,但是当我查看表时我可以看到它们:
我将所有产品作为计算机或移动设备插入而不是产品。
答案 0 :(得分:3)
你在继承的许多怪癖中磕磕绊绊:继承层次结构中没有“全局”约束,因此你不能拥有继承层次结构的外键。
您在product
上定义的主键不扩展为computer
。
即使SELECT
上的product
也会为继承子项附加结果,但这些不是表parent
的一部分,因此不能用作外语的目标键。外键仅在sale
和product
之间,继承子项被排除在外。
使用继承没有正确的方法。
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)
);
现在没有sale
到computer
的直接外键引用,但由于product_id
和computer
的{{1}}相同,因此您始终可以找到product
的唯一计算机(如果存在):
sale
如果您有更多产品“子类型”,则可以添加更多左连接。