【问题标题】:Oracle table creation missing right parenthesisOracle表创建缺少右括号
【发布时间】:2016-04-06 05:00:48
【问题描述】:

这应该是一个非常简单的问题,但我就是看不出有什么问题。我正在尝试在所述表上创建一个带有一些检查而不是空约束的表,但是在尝试执行命令时出现缺少右括号的错误。

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

下面的完整错误 -

【问题讨论】:

  • dateOfBirth DATE() 改为DATE

标签: oracle


【解决方案1】:

“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

【讨论】:

  • 我一直认为您可以在检查约束中使用 SYSDATE,但每天都会学到新东西!谢谢。
  • @DaveDavidson - 这是有道理的,如果你从一开始就决定一个约束应该是真还是假,答案不应该是“它取决于”。如果今天约束为真,您可以更改记录(添加、更新、删除),而明天约束不再满足怎么办?这将是让您的数据库变得一团糟的好方法。
猜你喜欢
  • 1970-01-01
  • 2020-02-07
  • 2023-04-08
  • 2021-11-10
  • 2019-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-29
相关资源
最近更新 更多