【发布时间】:2018-07-14 13:24:03
【问题描述】:
我这样做了,它有效:
CREATE TABLE OrderLine
(
Invoice_ID varchar2(10) PRIMARY KEY NOT NULL,
Item_ID varchar2(10) NOT NULL,
Unit_Price number(6,2) NOT NULL,
Quantity number(6) NOT NULL,
Total_Price number(38,2) AS (CASE WHEN Quantity >= 50 THEN
((Unit_Price*Quantity*0.80) ELSE (Unit_Price*Quantity) END),
CONSTRAINT fk_item_invoice FOREIGN KEY(Invoice_ID) REFERENCES Invoice (Invoice_ID),
CONSTRAINT fk_item_item FOREIGN KEY(Item_ID) REFERENCES Item (Item_ID),
CONSTRAINT Unit_Price_CK CHECK (Unit_Price > 0),
CONSTRAINT Quantity_CK CHECK (Quantity > 0),
);
CREATE TABLE Invoice
(
Invoice_ID varchar2(10) PRIMARY KEY NOT NULL,
Office_ID varchar2(7) NOT NULL,
Invoice_Date Date NOT NULL,
Total_Cost number (9) NOT NULL,
CONSTRAINT fk_order_Office FOREIGN KEY(Office_ID) REFERENCES Office (Office_ID),
CONSTRAINT Total_Cost_CK CHECK (Total_Cost > 0)
);
我想在创建表时计算TotalCost,而不是通过查询来计算 TotalPrice(s) 的总和。这可能吗?
PS:我正在使用 SQL Developer。
【问题讨论】:
-
你的问题毫无意义。查询是您从数据库中提取信息的方式。创建表时,总和为
NULL,因为没有行。 -
这是一个糟糕的设计。您已将业务规则(批量购买的折扣)硬编码到表的结构中。这是对虚拟列的非常糟糕的使用。除此之外,虚拟列是针对其表的列定义的:我们不能引用其他表上的列,这就是您需要对
TotalPrice求和的。