首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ORA-00907:“缺少右括号”

ORA-00907:“缺少右括号”
EN

Stack Overflow用户
提问于 2021-04-09 19:17:08
回答 1查看 89关注 0票数 0

首先,我很抱歉再次问了同样的问题,但是关于旧主题的信息在我的oraclesql代码中不起作用,其次,可能有一些语法错误,我上学期在学校学到了mysql,但是现在我们正在学习oraclesql和旧的mysql信息,所以我有点困惑。

因此,我的问题是,我想创建三个相关的表(电影放映-演员),但我正在失去右括号。尝试用外键将强制转换表连接到电影表,将参与者表连接到强制转换表。我做错什么了?它有多大的空间?

代码语言:javascript
复制
CREATE TABLE Movie (
    movie_id NUMBER(7) NOT NULL,
    movie_name varchar2(50) NOT NULL ,
    movie_director varchar2(50) NOT NULL ,
    movie_year INT(4) NOT NULL ,
    movie_duration INT(3) ,
    movie_language varchar2(15) ,
    movie_rating number(4,2) , 
    PRIMARY KEY(movie_id),
    CONSTRAINT is_unique UNIQUE(movie_id),
    CONSTRAINT movie_id_checker CHECK(movie_id>0 and movie_id<=9999999)
);

CREATE TABLE Casts (
    movie_id_fk INT(7) FOREIGN KEY REFERENCES Movie(movie_id) ,
    
    cast_id INT(7) NOT NULL, 
    actor_fullname varchar2(50) NOT NULL ,
    actor_role varchar2(50) ,
    PRIMARY KEY(cast_id),
    CONSTRAINT is_unique UNIQUE(cast_id),
    CONSTRAINT cast_id_checker CHECK(cast_id>0 and cast_id<=9999999)
);

CREATE TABLE Actor (
    cast_id_fk INT(7) FOREIGN KEY REFERENCES Casts(cast_id) ,
    
    actor_id INT(7) NOT NULL,
    actor_name CHAR(30) ,
    actor_surname CHAR(25) ,
    actor_gender CHAR(5) ,
    actor_age CHAR(3) CONSTRAINT real_age_check CHECK(actor_age>0 AND actor_age<=150),
    PRIMARY KEY(actor_id),
    CONSTRAINT is_unique UNIQUE(actor_id),
    CONSTRAINT actor_id_checker CHECK(actor_id>0 and actor_id<=9999999)
)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-09 19:25:31

这些错误是:

  • INTNUMBER(4,0)而不是INT(4)
  • 不能在同一列上具有唯一键和主键。
  • 内联外键只需要REFERENCES关键字,而不需要FOREIGN KEY

其他问题:

  • 您可能不希望参与者名称/姓氏作为固定长度的CHAR字符串,而希望我们使用可变长度的VARCHAR2
  • 您可能希望性别是固定列表中的代码(可以是长的,也可以是适合描述演员的短代码),而不是字符串。
  • 您可能不希望有一个AGE列,因为它将在演员的第一个生日一开始就过时;相反,有一个DATE_OF_BIRTH列是DATE数据类型,然后您可以在必要时计算年龄。
  • 使用表名作为每个列的前缀是对键笔画的浪费;最好只是将这些列命名为没有前缀的列。类似于fk作为后缀。
  • 如果您对NUMBER(7,0)值使用id值,则不需要检查它是否小于或等于9999999,因为不可能是更大的值;但是,您可以有零值或负值,因此下限的check约束可能仍然有效。
  • 如果您使用的是Oracle12c或更高版本,那么可能应该对IDENTITY值使用一个id列,除非您从第三方获取id值。
代码语言:javascript
复制
CREATE TABLE Movie (
    id       NUMBER(7,0) NOT NULL,
    name     varchar2(50) NOT NULL ,
    director varchar2(50) NOT NULL ,
    year     NUMBER(4,0) NOT NULL ,
    duration NUMBER(3,0),
    language varchar2(15) ,
    rating   number(4,2) , 
    PRIMARY KEY(id),
    CONSTRAINT movie_id_checker CHECK(id>0)
);

CREATE TABLE Casts (
    movie_id INT REFERENCES Movie(id) ,
    id       NUMBER(7,0) NOT NULL, 
    fullname varchar2(50) NOT NULL ,
    role     varchar2(50) ,
    PRIMARY KEY(id),
    CONSTRAINT cast_id_checker CHECK(id>0)
);

CREATE TABLE Actor (
    cast_id       NUMBER(7,0) REFERENCES Casts(id) ,
    id            NUMBER(7,0) NOT NULL,
    name          VARCHAR2(30) ,
    surname       VARCHAR2(25) ,
    gender        CHAR(1)
                  CHECK ( gender IN ( 'M', 'F', 'X', 'Y', 'Z' ) ),
    date_of_birth DATE
                  CONSTRAINT real_age_check CHECK(date_of_birth >= DATE '1870-01-01' ),
    PRIMARY KEY(id),
    CONSTRAINT actor_id_checker CHECK(id>0)
);

db<>fiddle https://dbfiddle.uk/?rdbms=oracle_18&fiddle=3a92c9452b503b1e2065af5ba431929f

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67027060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档