2016-04-05 90 views
0

这应该是一个非常简单的问题,但我只是看不出什么是错的。我试图创建一个表,有几个检查,而不是空表约束,但是当我试图执行命令时,我得到一个缺少右括号错误。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()”。 另外,您不能在检查约束中使用SYSDATE,您可能希望使用触发器,并且在“CAREGORY”中存在拼写错误。在检查约束

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

上SYSDATE编辑 - 添加文档参考:

您可以像这样运行它的检查约束 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

我总是假设你可以在检查约束中使用SYSDATE,但每天都会学到新的东西!谢谢。 – DaveDavidson

+0

@DaveDavidson - 有道理的,如果你从一开始就决定一个约束是真的还是假的,答案就不应该“取决于”。如果今天的约束是真的,那么你可以改变记录(添加,更新,删除),并且明天约束不再满足?这将是在数据库中混乱不堪的好方法。 – mathguy