ORA-00907: "missing right parenthesis"

ORA-00907: "missing right parenthesis"

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

所以我的问题是我想创建 3 个相关的 table(电影演员),但我缺少右括号。尝试使用外键将演员 table 连接到电影 table,将演员 table 连接到演员 table。我究竟做错了什么?意大利面怎么样?

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

错误是:

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

其他问题:

  • 您可能不希望 actor name/surname 作为固定长度 CHAR 字符串,而希望我们使用可变长度 VARCHAR2.
  • 您可能希望性别是固定列表中的代码(可以根据您认为适合描述演员的长度而定),而不是字符串。
  • 您可能不希望有一个 AGE 列,因为一旦演员的第一个生日到来,该列就会过时;取而代之的是 DATE_OF_BIRTH 列,它是 DATE 数据类型,然后您可以在必要时计算年龄。
  • 使用table名称作为每列的前缀是浪费击键;您最好只为列命名而不带前缀。类似于 fk 作为后缀。
  • 如果您对 id 值使用 NUMBER(7,0),则无需检查它是否小于或等于 9999999,因为它不可能是更大的值;但是,您可以使用零值或负值,因此下限的检查约束可能仍然有效。
  • 如果您使用的是 Oracle 12c 或更高版本,那么您可能应该为 id 值使用 IDENTITY 列,除非您从第三方获取 id 值。
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 here