2016-04-05 407 views
0

これはかなり単純な問題ですが、何が間違っているか分かりません。私はいくつかのチェックとnullの制約が上記のテーブルにテーブルを作成しようとしていますが、コマンドを実行しようとすると右の括弧のエラーが表示されなくなりました。フル・エラー以下Oracleテーブルの作成に右括弧がありません

CREATE TABLE students (
    studentID NUMBER(5) PRIMARY KEY, 
    forename VARCHAR2(15) NOT NULL, 
    surname VARCHAR2(15) NOT NULL, 
    street VARCHAR2(20), 
    city VARCHAR2(15), 
    postcode VARCHAR2(10) NOT NULL, 
    dateOfBirth DATE() NOT NULL CHECK(dateOfBirth BETWEEN DATE '1999-01-01' AND SYSDATE), 
    gender VARCHAR2(10) CHECK(gender = 'male' OR gender = 'female' OR gender = 'both'), 
    category VARCHAR2(15) NOT NULL CHECK(category = 'first year undergraduate' OR caregory = 'postgraduate'), 
    fulltimeStudent VARCHAR(5) NOT NULL CHECK(fulltimeStudent = 'yes' OR fulltimeStudent = 'no'), 
    nationality VARCHAR(25) NOT NULL, 
    smoker VARCHAR(5) CHECK(smoker = 'yes' OR smoker = 'no') AND NOT NULL, 
    specialNeeds VARCHAR(30), 
    additionalComments VARCHAR(50), 
    status VARCHAR(15) NOT NULL CHECK(status = 'placed' or status = 'waiting') 
    ); 

- enter image description here

+0

'dateOfBirth DATE()'それを 'DATE'に変更する –

答えて

2

括弧は必要 ")(DATE" ではありません。 また、CHECK制約内でSYSDATEを使用することはできません。代わりにトリガーを使用したい場合があります。また、 "CAREGORY"にタイプミスがあります。

あなたはこのようにそれを実行することができます:チェック制約でSYSDATEの

CREATE TABLE students (
    studentID NUMBER(5) PRIMARY KEY, 
    forename VARCHAR2(15) NOT NULL, 
    surname VARCHAR2(15) NOT NULL, 
    street VARCHAR2(20), 
    city VARCHAR2(15), 
    postcode VARCHAR2(10) NOT NULL, 
    dateOfBirth DATE NOT NULL, 
    gender VARCHAR2(10) CHECK(gender = 'male' OR gender = 'female' OR gender = 'both'), 
    category VARCHAR2(15) NOT NULL CHECK(category = 'first year undergraduate' OR category = 'postgraduate'), 
    fulltimeStudent VARCHAR(5) NOT NULL CHECK(fulltimeStudent = 'yes' OR fulltimeStudent = 'no'), 
    nationality VARCHAR(25) NOT NULL, 
    smoker VARCHAR(5) NOT NULL CHECK(smoker = 'yes' OR smoker = 'no'), 
    specialNeeds VARCHAR(30), 
    additionalComments VARCHAR(50), 
    status VARCHAR(15) NOT NULL CHECK(status = 'placed' or status = 'waiting') 
    ); 

編集・追加しましたドキュメントの参照:

:チェック制約の https://docs.oracle.com/cd/B28359_01/server.111/b28286/clauses002.htm

条件は以下の 構造を含めることはできません

Subqueries and scalar subquery expressions 

Calls to the functions that are not deterministic (CURRENT_DATE, CURRENT_TIMESTAMP, DBTIMEZONE, LOCALTIMESTAMP, SESSIONTIMEZONE, SYSDATE, SYSTIMESTAMP, UID, USER, and USERENV) 

Calls to user-defined functions 

Dereferencing of REF columns (for example, using the DEREF function) 

Nested table columns or attributes 

The pseudocolumns CURRVAL, NEXTVAL, LEVEL, or ROWNUM 

Date constants that are not fully specified 
+0

私はいつもCHECK制約でSYSDATEを使うことができると思っていましたが、毎日新しいものを学びます!ありがとうございました。 – DaveDavidson

+0

@DaveDavidson - 初めから制約が真であるか偽であるべきかを決めるのであれば、答えは「それに依存する」べきではありません。今日の制約が真であれば、レコードを変更(追加、更新、削除)することができますが、明日の制約はもはや満たされません。それはあなたのデータベースに大きな混乱をもたらす素晴らしい方法でしょう。 – mathguy

関連する問題