我想創建一個簡單的數據庫,其中有一張客戶數據表和一張訂單數據表。我正在嘗試編寫一個約束條件,以便客戶在特定日期內不能訂購超過特定數量的商品。下面是我有: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