1

テーブル「Student」といくつかの属性があります。そのうちの2つはこの特定の問題で重要です。「ジュニア」の分類(グレードレベル)の生徒は、正確に55〜84時間(クレジット)であることを確認する必要があります。

これが私がこれまでにOracleで宣言に関して持っているものです(不要なコードを削除しました):

CREATE TABLE Students (  
id INTEGER,  
name CHAR(10) NOT NULL,  
classification CHAR(10) NOT NULL,  
hours INTEGER,  
gpa NUMBER(3,2) NOT NULL,  
mentor INTEGER,  
-- IC4:  
-- To be classified as a 'junior', a student must have  
-- completed between 55 and 84 hours (inclusive).  
CONSTRAINT IC4 CHECK (classification != 'junior' AND (hours < 55 AND hours > 84))),  
);

Oracleは次のエラーをスローします。

23行目のエラー:  
ORA-00922:オプションが欠落しているか無効です  

制約を正しくフォーマットしていないことは確かですが、教授は宣言に約3秒を費やし、自分でそれを理解するように指示しました。1属性の制約は知っていますが、2つの属性を同時に組み合わせる方法がわかりません。誰かが私を助けることができますか?

*基本的に、他のコードでは、ネストされたifステートメントのように見えます。

if (classification == "junior") {  
    if (hours < 55 && hours > 84)  
        throwSomeError("Foolish!");  
}

それをSQLに変換できないようです。このくそったれの間隔が奇妙であるならば、私は私の命を救うためにそれをフォーマットすることができないことをお詫びします。

4

4 に答える 4

1

末尾にコンマがあり、閉じ括弧が多すぎます。

...84))),);

投稿する前に何かを切り取っていない限り、これはエラーが23行目を参照している場合に当てはまります(ただし、コードの問題を確認するのが難しいため、まったく表示されないことを願っています)。それが次のようになった場合、あなたがコンパイルしたものは次のようになります。

...84)));

しかし、他の人が指摘しているように、とにかく条件は間違っています。私が望む結果を得る1つの方法は次のとおりです。

...
CONSTRAINT IC4 CHECK (classification != 'junior' OR hours BETWEEN 55 AND 84)
);

がである場合にのみチェックが適用され、その他は制限されないORことを意味します。(分類ごとに異なるルールが必要な場合は、コメントでリンクされている非常によく似た質問Chris Saxonを参照してください)。hoursclassification'junior'classification

いくつかのテストデータ付き:

insert into students values (1, 'A', 'junior', 54, 1, 1); -- ORA-02290
insert into students values (2, 'B', 'junior', 55, 1, 1); -- OK
insert into students values (3, 'C', 'junior', 84, 1, 1); -- OK
insert into students values (4, 'D', 'junior', 85, 1, 1); -- ORA-02290

insert into students values (5, 'E', 'senior', 54, 1, 1); -- OK
insert into students values (6, 'F', 'senior', 55, 1, 1); -- OK
insert into students values (7, 'G', 'senior', 84, 1, 1); -- OK
insert into students values (8, 'H', 'senior', 85, 1, 1); -- OK

select * from students order by id;

  ID NAME       CLASSIFICATION HOURS GPA MENTOR
---- ---------- -------------- ----- --- ------
   2 B          junior            55  1.00      1 
   3 C          junior            84  1.00      1 
   5 E          senior            54  1.00      1 
   6 F          senior            55  1.00      1 
   7 G          senior            84  1.00      1 
   8 H          senior            85  1.00      1 

 6 rows selected 

BETWEENは包括的であるため、これは次と同じです。

CONSTRAINT IC4 CHECK (classification != 'junior' OR (hours >= 55 AND hours <= 84))

classificationまた、特にこの制約では大文字と小文字が区別されるため、チェック制約が必要になる場合があります。または、別のclassificationテーブルがあり、このテーブルの列に外部キー制約があることが望ましい。しかし、それはおそらくこの割り当てのあなたのコントロールの外にあります。

于 2013-02-04T07:39:59.413 に答える
0

それhoursは許可されNullており、sCHECKを許可するフィールドを処理できない可能性があります。Null

だからhours integer Not NULL、あなたが考えるなら、デフォルト値を作って与えてみてください。

また、あなたの状態は不一致です..それもチェックしてください....

于 2013-02-04T05:52:53.393 に答える
0

制約のロジックがオフになっているようです。時間は55未満および84を超えることはできません。ORを使用してみてください。

CONSTRAINT IC4 CHECK (classification != 'junior' AND (hours < 55 OR hours > 84))

ただし、これは、classification ='junior'の場合、時間が55から84の間であることを保証するものではありません。代わりにこれを使用してみてください。

CONSTRAINT IC4 CHECK (classification = 'junior' AND hours >= 55 AND hours <= 84))

幸運を。

于 2013-02-04T06:04:32.423 に答える
0

'junior'の値が55から84の間であることを確認したい場合は、以下のコンパイル可能なコードを使用してください-

CREATE TABLE Students 
( id INTEGER, 
name CHAR(10) NOT NULL,
 classification CHAR(10) NOT NULL,
 hours INTEGER, gpa NUMBER(3,2) NOT NULL,
 mentor INTEGER, -- IC4: 
-- To be classified as a 'junior', 
a student must have -- completed between 55 and 84 hours (inclusive). 
CONSTRAINT IC4 CHECK (classification = 'junior' AND (hours >= 55 AND hours <= 84))) ;
于 2013-02-04T07:16:31.140 に答える