2012-10-17 31 views
1

這是一個非常初學者的問題,但我的谷歌技能失敗了,我似乎無法在筆記中找到任何東西。約束條件,我如何比較一個屬性的值與另一個?

在我的作業中,我必須根據教授給出的標準創建幾個約束條件。

我們有一個名爲Employee的表。員工有一個等級(char),該等級可以是'DB Guru','DB專家'或'DB新手'。他們也有薪水(整數)。我能夠輕鬆制定這個限制。

自帶之後,以確保任何與等級「DB大師」有上述200

我很困惑,我該怎麼檢查,看看是否爲等級的值是「工資約束DB大師「,並檢查薪水是否超過200.這是檢查排名的代碼,我似乎無法找到如何去做。

這是我到目前爲止已經試過:

IC2: The salary of a 'DB guru' is above 200. 
*/ 
CONSTRAINT IC2 CHECK(rank IN('DB guru') AND salary > 200)), 

這給我的錯誤: ORA-00922:在第14行 ERROR缺失或無效選項

第14行是Cconstraint我張貼,所以我猜這是一個語法錯誤。

有人能告訴我一個正確的語法來比較這些值的例子嗎?

非常感謝您的幫助。

編輯:這是整個創建語句,以及我在每個約束的嘗試。

-- IMPORTANT: use the names IC1, IC2, etc. as given below. 
-- -------------------------------------------------------------------- 
DROP TABLE Employee CASCADE CONSTRAINTS; 
DROP TABLE Dependent CASCADE CONSTRAINTS; 
-- 
CREATE TABLE Employee 
( 
id  INTEGER PRIMARY KEY, 
name CHAR(10) NOT NULL, 
rank CHAR(10) NOT NULL, 
salary INTEGER NOT NULL, 
/* 
IC1: The rank is one of: 'DB guru', 'DB expert', or 'DB rookie' 
*/ 
COnstraing IC1 CHECK(rank IN('DB guru', 'DB expert', 'DB rookie')), 

IC2: The salary of a 'DB guru' is above 200. 
*/ 
CONSTRAINT IC2 CHECK(rank IN('DB guru') AND salary > 200)), 
/* 
IC3: The salary of a 'DB expert' is between 80 and 220 (inclusive). 
*/ 
CONSTRAINT IC3 CHECK(rank IN('DB expert) AND salary >= 80 AND salary <= 220), 
/* 
IC4: The salary of a 'DB rookie' is less than 100. 
*/ 
CONSTRAINT IC4 CHECK(rank IN('DB rookie') AND salary < 100)) 
); 
+0

+1對於實際嘗試做你的功課! :) – Miguel

+0

哈哈沒有信譽沒有答案,對不對? – LemonFlip

+0

你可以發佈你的整個創建/更改語句嗎?我懷疑),最後可能是一個語法錯誤。 – eaolson

回答

2

考慮,再次,這是什麼檢查,他說:

CONSTRAINT IC2 CHECK(rank IN('DB guru') AND salary > 200)) 

這是說,對於行,rank必須正好等於'DB Guru',並salary必須大於200那是不是你想要什麼。你需要反過來思考 - 如果rank其他而不是'DB Guru',那麼你不在乎(在這個約束中)他們的工資是多少。所以,你真的想:

CONSTRAINT IC2 CHECK(rank != 'DB guru' OR salary > 200) 

您還會在最後有一個額外的)(算上() S IN的第一個例子,你會發現,他們不均衡)。您在IC4的結尾處有類似的錯誤。


側欄@wildplasser - 正如我已經說過了,我們這兩個IC2 s爲等效,使用布爾邏輯的一點點:

NOT(zrank IN('DB guru') AND salary <= 200) --Your IC2 

等於:

(NOT zrank IN ('DB guru')) OR (NOT salary <= 200) --De Morgan's law 

等號:

(zrank != 'DB guru') OR (NOT salary <= 200) --Simplification of first 

等於:

(zrank != 'DB guru') OR (salary > 200) --Simplification of second 

等於:

zrank != 'DB guru' OR salary > 200 --Removal of brackets, my IC2 
+0

請注意,專家和大師的工資範圍重疊,所以簡單的OR在這裏不起作用。 – wildplasser

+0

原始IC3的上限爲220,與IC2的下限重疊。您的實施將阻止專家的薪水在{200,220}範圍內。 – wildplasser

+0

@wilplasser - 我的答案中沒有顯示修正的IC3,但它需要與我爲IC2顯示的相同處理 - 它將是CHECK(等級!='DB專家'或工資在80和220)'。 'IC2'不控制專家的工資範圍,因爲'rank!='DB Guru''爲真,所以符合IC2。 –

1
-- -------------------------------------------------------------------- 
-- IMPORTANT: use the names IC1, IC2, etc. as given below. 
-- -------------------------------------------------------------------- 

DROP TABLE Employee CASCADE ; 
-- 
CREATE DOMAIN dbarank AS CHAR(10) CHECK (VALUE IN ('DB guru', 'DB expert', 'DB rookie')); 

CREATE TABLE Employee 
(id  INTEGER PRIMARY KEY 
, name CHAR(10) NOT NULL 
, zrank dbarank NOT NULL -- "rank" is a reserved name 
, salary INTEGER NOT NULL 

-- IC2: The salary of a 'DB guru' is above 200. 
, CONSTRAINT IC2 CHECK (NOT(zrank IN('DB guru') AND salary <= 200)) 

-- IC3: The salary of a 'DB expert' is between 80 and 220 (inclusive). 
, CONSTRAINT IC3 CHECK (NOT (zrank IN ('DB expert') AND (salary < 80 OR salary > 220))) 
-- IC4: The salary of a 'DB rookie' is less than 100. 
, CONSTRAINT IC4 CHECK (NOT (zrank IN('DB rookie') AND salary >= 100)) 
); 
INSERT INTO Employee(id,name,zrank,salary) VALUES(1, 'Pipo', 'Clown', 1); 
INSERT INTO Employee(id,name,zrank,salary) VALUES(1, 'Lutser', 'DB rookie', 110); 
INSERT INTO Employee(id,name,zrank,salary) VALUES(1, 'Prutser', 'DB rookie', 90); 

注:因爲我使用Postgres的,有在語法上的些許差異。 Oracle確實有域名,因此將IC1作爲域約束實施的「技巧」仍然有效。

結果:

CREATE DOMAIN 
NOTICE: CREATE TABLE/PRIMARY KEY will create implicit index "employee_pkey" for table "employee" 
CREATE TABLE 
ERROR: value for domain dbarank violates check constraint "dbarank_check" 
ERROR: new row for relation "employee" violates check constraint "ic4" 
INSERT 0 1 

UPDATE:固定NOT(AND/OR)的東西,使得限制排斥。

+0

當前定義的'IC2','IC3'和'IC4'可以防止任何*行被插入到這個表中。 –

+0

我看到,OP和AND/OR也有困難。沒有想到這會是微不足道的......我會看看我能否解決它。 – wildplasser

+0

作業的要點是創建約束,意圖來自這些約束的錯誤。我們正在分析他們來自哪裏以及爲什麼。我非常感謝您對邏輯的幫助和幫助。 – LemonFlip

相關問題