2017-03-23 94 views
1

SQL查詢錯誤我已經定義在DEPT表約束,這將確保所有的管理人員有年齡> 30 我是初學,所以我不想使用用戶定義的函數。 這裏我想要一個簡單的解決方案。這可以將我的檢查應用於create table語句。 我想用支票陳述或斷言語句。在檢查聲明

create table emp(eid int primary key,ename varchar(20),age int,salary real CHECK (salary >= 10000)); 
create table dept(did int primary key, buget real,managerid int foreign key (managerid) references emp check ((select eid from emp where age >30))); 

及其給下面的錯誤,我不知道爲什麼

Msg 156, Level 15, State 1, Line 54 
Incorrect syntax near the keyword 'select'. 
Msg 102, Level 15, State 1, Line 54 
Incorrect syntax near ')'. 

我使用Microsoft SQL管理工作室2014年

告訴我,我做的哪裏錯誤。 謝謝!

+2

順便說一句,你不應該在'age'存儲爲一個固定值,因爲你需要每一次更新年齡變化。存儲出生日期,而不是'年齡'是一個計算列 – Lamak

+0

看一看:http://stackoverflow.com/questions/3880698/can-a-check-constraint-relate-to-another-table或http ://stackoverflow.com/questions/13000698/sub-queries-in-check-constraint – etsa

+0

什麼你所描述的是一個業務規則。不是數據完整性規則。因此,最好在應用程序層而不是數據庫層中實現該規則。 –

回答

1

你可以做到這一點沒有UDF。您可以使用外鍵約束和計算列。

create table emp (
    eid int primary key, 
    ename varchar(20), 
    age int, 
    salary real CHECK (salary >= 10000), 
    manager_eligible as (case when age > 30 then 1 else 0 end), 
    unique (manager_eligible, eid) 
); 

create table dept(
    did int primary key, 
    buget real, 
    managerid int, 
    manager_eligible as (1), 
    foreign key (manager_eligible, managerid) references emp(manager_eligible, eid) 
); 

我應該補充一點,UDF通常會減慢速度。所以能夠用外鍵做到這一點也應該使插入和更新更快。

+0

你可以提供一個解決方案嗎? –

+1

這是使用計算列有外鍵的一種有趣的方式。很漂亮。 –