我想创建一个简单的数据库,其中有一张客户数据表和一张订单数据表。我正在尝试编写一个约束条件,以便客户在特定日期内不能订购超过特定数量的商品。下面是我有:PostgreSQL中的约束和断言
CREATE TABLE CUSTOMER
(
CUSTOMER_NUM CHAR(3) PRIMARY KEY,
CUSTOMER_NAME CHAR(35) NOT NULL,
STREET CHAR(15),
CITY CHAR(15),
STATE CHAR(3),
ZIP CHAR(5),
);
CREATE TABLE ORDERS
(
ORDER_NUM CHAR(5) PRIMARY KEY,
ORDER_DATE DATE,
CUSTOMER_NUM CHAR(3),
CONSTRAINT CUSTOMER_NUM_FKEY FOREIGN KEY (CUSTOMER_NUM)
REFRENCES CUSTOMER (CUSTOMER_NUM) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE
);
这是我写的强制执行此约束,但它不工作。我假设它是因为ORDER_NUM和ORDER_DATE从不具有相等的值。
CREATE ASSERTION ITEM_LIMIT
CEHCK(
( SELECT COUNT(*)
FROM CUSTOMER C1, ORDERS O1
WHERE C1.CUSTOMER_NUM = O1.CUSTOMER_NUM AND
O1.ORDER_DATE = O1.ORDER_NUM
) <= 1000
我的问题是如何让这个约束工作,就像我如何限制每天的订单数量。
声明不是[postgresql的保留关键字](http://www.postgresql.org/docs/9.1/interactive/sql-keywords-appendix.html),尽管它适用于sql-99和92。 – 2012-03-11 18:26:50
@Clodoaldo:这是无关紧要的。这是PostgreSQL中的关键词,它不是*保留*关键词;这意味着尽管'ASSERTION'被理解为像CREATE ASSERTION ...这样的上下文中的关键词,它可以被用作标识符(所以像'CREATE TABLE assertion ...'是允许的)。 PostgreSQL不接受CREATE ASSERTION语句,它只是不执行它们描述的断言。 – ruakh 2012-03-11 19:45:33
@ruakh如果你试图在PostgreSQL中创建一个断言(至少9.4),你会得到'错误:CREATE ASSERTION还没有实现'。所以我会说它不接受他们。你描述的行为(接受但不强制)听起来更像MySQL。 – beldaz 2015-03-06 21:45:54