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)
)
错误是:
INT
或 NUMBER(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
首先,对于再次问同样的问题,我深表歉意,但是关于旧主题的信息在我的 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)
)
错误是:
INT
或NUMBER(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