2017-03-23 13 views
1

Deptでテーブルの制約を定義して、すべてのマネージャの年齢が30を超えないようにする必要があります。 私は初心者ですので、ユーザ定義関数を使用したくありません。 ここでは簡単な解決策が必要です。これは私のチェックをcreate tableステートメントに適用することができます。 私はcheckステートメントまたはアサーションステートメントを使いたいです。Sqlクエリ文のクエリエラー

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))); 

とその次のエラーを与えて、私は、Microsoft SQL管理スタジオに2014

を使用していますなぜ

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 ')'. 

私は知らない私がやっているところを教えてください違う。 ありがとう!

+2

時代が変わるたびに更新する必要があるので、 'age'を固定値として保存しないでください。代わりに生年月日を保存し、「年齢」を計算カラムに設定してください – Lamak

+0

見てください:http://stackoverflow.com/questions/3880698/can-a-check-constraint-relate-to-another-table or 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

これは、外部キーを持つ計算カラムを使用する興味深い方法です。かなり滑らか。 –