【问题标题】:sql error ora-00907 missing right parenthesis create tablesql 错误 ora-00907 缺少右括号创建表
【发布时间】:2016-07-15 05:43:45
【问题描述】:

我正在创建一个这样的表,

CREATE TABLE ARTIST (

    ArtistID            Int             NOT NULL IDENTITY(1,1),
    LastName            Char(25)        NOT NULL,
    FirstName           Char(25)        NOT NULL, 
    Nationality         Char(30)        NULL,
    DateOfBirth         Numeric(4)      NULL, 
    DateDeceased        Numeric(4)      NULL,
    CONSTRAINT  ArtistPK            PRIMARY KEY(ArtistID),
    CONSTRAINT  ArtistAK1           UNIQUE(LastName, FirstName),    
    CONSTRAINT  BirthValuesCheck    CHECK (DateOfBirth < DateDeceased),
    CONSTRAINT  ValidBirthYear      CHECK
            (DateOfBirth LIKE '[1-2][0-9][0-9][0-9]'),
    CONSTRAINT  ValidDeathYear      CHECK
            (DateDeceased LIKE '[1-2][0-9][0-9][0-9]')
);

我得到这个错误:

错误报告 - SQL 错误:ORA-00907:缺少右括号 00907. 00000 - “缺少右括号”

知道为什么吗?

【问题讨论】:

  • 这不是一个了不起的答案,但是您是否尝试过删除约束然后一一添加以查看哪个失败?
  • 为什么你的名字和姓氏有UNIQUE 约束?不能有多个同名艺术家吗?另外,为什么不使用DATE 日期类型作为出生/死亡日期?
  • char(25)char(30) 数据类型几乎可以肯定是一个糟糕的选择。姓名和国籍是可变长度字符串,请改用varchar2。您的 DateOfBirthDateDeceased 几乎可以肯定是 date 而不仅仅是存储数字年份。如果要对数字字段进行检查约束,请进行数字比较(即YearOfBirth BETWEEN 1000 and 2999

标签: sql oracle ora-00907


【解决方案1】:

Oracle 12c syntax for identity columns 是:

GENERATED [ ALWAYS | BY DEFAULT [ ON NULL ] ]
AS IDENTITY [ ( identity_options ) ]

如果您使用的是 Oracle 11 或更低版本,则您不能拥有 IDENTITY 列,并且必须使用序列,但假设您使用的是 12c,那么您需要:

CREATE TABLE ARTIST (
    ArtistID            Int             NOT NULL GENERATED ALWAYS AS IDENTITY,
    LastName            Char(25)        NOT NULL,
    FirstName           Char(25)        NOT NULL, 
    Nationality         Char(30)        NULL,
    DateOfBirth         Numeric(4)      NULL, 
    DateDeceased        Numeric(4)      NULL,
    CONSTRAINT  ArtistPK            PRIMARY KEY(ArtistID),
    CONSTRAINT  ArtistAK1           UNIQUE(LastName, FirstName),    
    CONSTRAINT  BirthValuesCheck    CHECK (DateOfBirth < DateDeceased),
    CONSTRAINT  ValidBirthYear      CHECK
            (DateOfBirth LIKE '[1-2][0-9][0-9][0-9]'),
    CONSTRAINT  ValidDeathYear      CHECK
            (DateDeceased LIKE '[1-2][0-9][0-9][0-9]')
);

【讨论】:

  • 谢谢。现在我很确定这是问题所在。我会解决的。
  • 正如我所说,IDENTITY 列仅在 Oracle 12c 中引入。如果您使用的是 Oracle 11,那么您不能使用它们,您必须使用序列。删除 GENERATED ALWAYS AS IDENTITY 它将起作用,然后您可以使用 CREATE SEQUENCE artist__seq; 创建具有默认选项的序列,并可以在您的 INSERT 语句中使用该序列。
  • 切换到 sql server 完成了我的任务:-|
  • @VasinYuriy“没有为我解决”不是一个建设性的陈述,因为它没有告诉我们什么不起作用或错误是什么;我建议您 ask a new question 并在 minimal reproducible example 中包含您的问题的完整详细信息,包括您的代码的最小示例、它产生的错误以及您想要实现的目标的描述。
  • @MT0,在不同版本的数据库中,有不同的方法来定义主键。我在这篇文章中找到了解决方案:stackoverflow.com/questions/11296361/…
猜你喜欢
  • 2016-10-23
  • 2018-03-27
  • 2023-03-13
  • 1970-01-01
  • 2012-09-28
  • 2015-03-31
  • 2018-07-18
  • 1970-01-01
相关资源
最近更新 更多