为啥这个表创建脚本会给我错误?

Posted

技术标签:

【中文标题】为啥这个表创建脚本会给我错误?【英文标题】:Why does this table-creation script give me errors?为什么这个表创建脚本会给我错误? 【发布时间】:2009-04-20 19:06:11 【问题描述】:
CREATE TABLE DEPARTMENTS (
dept_num                 NUMBER          (8)                                                 
dept_name               VARCHAR2         (20) NOT NULL,           
dept_loc                    VARCHAR2         (25),
dept_phone             CHAR                   (13),
CONSTRAINT dept_num_pk PRIMARY KEY (dept_num)
) ;


CREATE TABLE JOB_HISTORY (
rank                              CHAR                 (20),                                          
date_attendance        NUMERIC          (10) NOT NULL,
fac_num                      INTEGER         (8),  
CONSTRAINT rank_pk PRIMARY KEY (rank),
CONSTRAINT fk_fac_num FOREIGN  KEY (fac_num) REFERENCES FACULTY (fac_num)
) ;


CREATE TABLE FACULTY (
fac_num                        INTEGER      (8),                                                   
fac_name                      CHAR             (15)      NOT NULL,
fac_last_name             CHAR              (15)      NOT NULL,
street                             VARCHAR2   (30),
city                                 VARCHAR2   (20),
state                              VARCHAR2    (2),
zip_code                       VARCHAR2    (10),
salary                            NUMERIC       (6,2),
earn_ytd                      NUMERIC       (6,2),
start_date                    DATE                          NOT NULL,
degree                          VARCHAR2      (15)   NOT NULL,
field                              CHAR                (15)   NOT NULL,
curr_rank                     CHAR                (20)  NOT NULL ,
dept_num                   NUMBER          (8),
CONSTRAINT fac_num_pk PRIMARY KEY (fac_num),
CONSTRAINT fk_curr_rank FOREIGN KEY (curr_rank) REFERENCES JOB_HISTORY (rank),
CONSTRAINT fk_dept_num FOREIGN KEY (dept_num)  REFERENCES DEPARTMENTS (dept_num)
);

CREATE TABLE SPEAKING_TOPICS (
code                         CHAR                    (10),                                               
title                          CHAR                    (20) NOT NULL,
last_given               CHAR                    (20),
time_given             NUMBER             (3),
fac_num_fke          INTEGER             (8),
CONSTRAINT code_pk PRIMARY KEY (code),
CONSTRAINT fk_fac_num  FOREIGN KEY (fac_num) REFERENCES FACULTY (fac_num)
) ;


CREATE TABLE FACULTY ( fac_num INTERG ORA-00907: missing right parenthesis -  
3 0.08 CREATE TABLE JOB_HISTORY ( rank  ORA-00907: missing right parenthesis -  
4 0.09 CREATE TABLE SPEAKING_TOPICS ( code  ORA-00907: missing right parenthesis 

【问题讨论】:

我们可以去掉标题中的请帮助噪音吗? 【参考方案1】:

一些提示:

您不能对INTEGER 使用精度。使用INTEGER 而不是INTEGER(8)。 (INTEGER其实和NUMBER(38)是一样的,所以已经有了精度。)

DEPARTMENTS 表中dept_num 列后面缺少逗号。

您不能在尚不存在的表上创建外键约束。 CREATE TABLE JOB_HISTORY ... 语句尝试在 FACULTY 表上创建外键约束,但此时尚未创建 FACULTY 表。从CREATE TABLE JOB_HISTORY 语句中删除约束fk_fac_num。在创建表FACULTY 后,使用类似的东西添加约束

ALTER TABLE JOB_HISTORY ADD CONSTRAINT fk_fac_num ...

SPEAKING_TOPICS 中没有名为 fac_num_fke 的列。你的意思是fac_num吗?

所有约束都必须具有不同的名称。将SPEAKING_TOPICS 中的外键约束的名称更改为其他名称。

对您的 SQL 进行这些更改后,我能够运行它并成功创建表。

【讨论】:

【参考方案2】:

下面是一个更正的脚本,带有注释块来解释什么是错误的。

/*
A comma was missing
*/
create table departments (
  dept_num number(8)
 ,dept_name varchar2(20) not null
 ,dept_loc varchar2(25)
 ,dept_phone char(13)
 ,constraint dept_num_pk primary key(dept_num)
);

/*
Don't specify INTEGER(8)... just say INTEGER.
Also, you can't reference the FACULTY table before you've created it. 
I've made that constraint into a separate command,
after FACULTY is created.
*/
create table job_history(
  rank char(20)                                          
 ,date_attendance numeric(10) not null
 ,fac_num integer  
 ,constraint rank_pk primary key(rank)
 --,constraint fk_fac_num foreign key (fac_num) references faculty(fac_num)
);

/*
Same issue with the INTEGER precision.
*/
create table faculty(
  fac_num integer                                                   
 ,fac_name char(15) not null
 ,fac_last_name char(15) not null
 ,street varchar2(30)
 ,city varchar2(20)
 ,state varchar2(2)
 ,zip_code varchar2(10)
 ,salary numeric(6,2)
 ,earn_ytd numeric(6,2)
 ,start_date date not null
 ,degree varchar2(15) not null
 ,field char(15) not null
 ,curr_rank char(20) not null
 ,dept_num number(8)
 ,constraint fac_num_pk
  primary key(fac_num)
 ,constraint fk_curr_rank
  foreign key(curr_rank)
  references job_history(rank)
 ,constraint fk_dept_num
  foreign key(dept_num)
  references departments(dept_num)
);

/*
This line is new.
JOB_HISTORY has to wait until FACULTY exists before
referencing it.
*/
alter table job_history 
add constraint fk_fac_num
foreign key(fac_num)
references faculty(fac_num);

/*
The INTEGER had a precision argument, again.
Also, the name of your foreign key on faculty(fac_num) was not unique; it 
matched the one used by JOB_HISTORY to refer to faculty(fac_num).
I've modified the name of that constraint to make it unique.

Finally, the foreign_key had the wrong field name.
It needs to refer to the
local field name, whose name includes an "fke" @ the end
*/
create table speaking_topics(
  code char(10)                                               
 ,title char(20) not null
 ,last_given char(20)
 ,time_given number(3)
 ,fac_num_fke integer 
 ,constraint code_pk primary key(code)
 ,constraint fk_spk_top_fac_num
  foreign key(fac_num_fke)
  references faculty(fac_num)
);

/*
If you want to DROP these tables, you must do so in a specific order,
since they reference each other.

You must also take an extra step to break the link btwn
JOB_HISTORY and FACULTY.

The below script will do it, but I've commented it out to avoid accidental
execution.
*/

--drop table speaking_topics;
--alter table job_history drop constraint fk_fac_num;
--drop table faculty;
--drop table job_history;
--drop table departments;

【讨论】:

【参考方案3】:

我不确定是否存在数据类型 INTERGER。

【讨论】:

【参考方案4】:

您在 FACULTY 表定义中有错字:“INTERGER”而不是 INTEGER

在 JOB_HISTORY 中相同。

【讨论】:

【参考方案5】:

Oracle 没有 INTEGER 数据类型。使用 NUMBER(10,0) 将保存 32 位整数样值。

Oracle 没有 NUMERIC 数据类型,您需要使用 NUMBER (8,2)。

这主要是拼写错误,但 Oracle 对其表数据类型非常挑剔。

【讨论】:

以上是关于为啥这个表创建脚本会给我错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 heroku 会给我这个“不兼容的类型”错误?

为啥这个 fgets 函数会给我一个分段错误?

为啥这个 type_traits 代码会给我一个整数到指针转换警告?

为啥苹果推送通知服务有时会给我错误 500?

为啥在我制作折线图时,plotly express 会给我一个属性错误?

为啥当我知道有足够的内存空间时 cudaMalloc 会给我一个错误?