【问题标题】:'Missing keyword' this error is coming while i create a table“缺少关键字”在我创建表时出现此错误
【发布时间】:2019-11-28 14:07:08
【问题描述】:

“缺少关键字”在我使用以下查询创建表时出现此错误:

CREATE TABLE ACCTS
(
ACCT_NO NUMBER (12),
ACCTH_NAME VARCHAR2(50),
ACCTH_ADD VARCHAR2(100),
ACCTH_STATE VARCHAR2(50),
ACCTH_DOB DATE ,
ACCT_DT_CREATED DATE,
BRANCH_CODE NUMBER(5),
ACCT_TYPE_CODE NUMBER(6),
CONSTRAINT ACCT_NO_PK PRIMARY KEY (ACCT_NO),
CONSTRAINT ACCTH_STATE_FK1 FOREIGN KEY (ACCTH_STATE) REFERENCES STATES (STATE_ID),
CONSTRAINT ACCT_TYPE_CODE_FK2 FOREIGN KEY (ACCT_TYPE_CODE) REFERENCES ACCT_TYPES(ACCT_TYPE_CODE)
)

【问题讨论】:

  • 错误消息应该准确地显示 where Oracle 认为它发现了错误(代码行和确切位置,或发现错误的字符)。显示完整错误消息始终很重要,而不仅仅是其摘要。

标签: sql database oracle error-handling create-table


【解决方案1】:

我将您的查询添加到 SQL Fiddle(添加缺少的表以便外键约束起作用)并且查询有效:

CREATE TABLE STATES
(
  STATE_ID VARCHAR2(50),
  CONSTRAINT ACCT_STATE_ID PRIMARY KEY (STATE_ID)
);

CREATE TABLE ACCT_TYPES
(
  ACCT_TYPE_CODE NUMBER(6),
  CONSTRAINT ACCT_TYPES_ID PRIMARY KEY (ACCT_TYPE_CODE)
);

CREATE TABLE ACCTS
(
  ACCT_NO NUMBER (12),
  ACCTH_NAME VARCHAR2(50),
  ACCTH_ADD VARCHAR2(100),
  ACCTH_STATE VARCHAR2(50),
  ACCTH_DOB DATE ,
  ACCT_DT_CREATED DATE,
  BRANCH_CODE NUMBER(5),
  ACCT_TYPE_CODE NUMBER(6),
  CONSTRAINT ACCT_NO_PK PRIMARY KEY (ACCT_NO),
  CONSTRAINT ACCTH_STATE_FK1 FOREIGN KEY (ACCTH_STATE) REFERENCES STATES (STATE_ID),
  CONSTRAINT ACCT_TYPE_CODE_FK2 FOREIGN KEY (ACCT_TYPE_CODE) REFERENCES ACCT_TYPES(ACCT_TYPE_CODE)
)

http://sqlfiddle.com/#!4/b726da

【讨论】:

  • 是的,我在此之前创建了该表,但仍然出现错误。一张桌子的PK也必须是另一张桌子的PK吗?
  • 如果您有两个具有相同 PK 的表(不仅是相同的列名,而是相同的数据,并且交叉相关),那么您可能应该重新审视您的数据模型。参见“第三范式”。
  • 外键必须引用另一个表中的主键(或者至少是具有唯一约束的列;也许它不必是主键)。我给出的 SQL 代码已经完全按照原样输入到 Oracle 中,并且可以正常工作。如果您的外键约束有效,我不明白为什么您的 SQL 会导致错误。
  • @DavidSugar - 澄清“其他”表有时实际上可能是“相同”表。 (这里可能不是这样,但有些人对此感到困惑,所以最好每次都正确陈述。)
猜你喜欢
  • 1970-01-01
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
  • 2022-12-22
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多