【问题标题】:ORA-00906: missing left parenthesis oracle error probably because I messed up the syntaxORA-00906: 缺少左括号 oracle 错误可能是因为我弄乱了语法
【发布时间】:2019-12-15 22:07:38
【问题描述】:

所以这是我尝试创建的与数据库中另一个表相关的表。我知道我在某处弄乱了语法,我只是不确定在哪里,因为 oracle 没有指出确切的错误行。任何帮助将不胜感激。是的,我是新手

CREATE TABLE USERS (
    USER_ID NUMBER(5) PRIMARY KEY,
    NAME VARCHAR2(255), 
    YEAR_OF_BIRTH YEAR, 
    SEX CHAR(2), 
    ADDRESS VARCHAR2(255), 
    PHONE_NUMBER VARCHAR2(20), 
    CA_ID NUMBER(5),
    FOREIGN KEY CA_ID REFERENCES CANDIDATE(CANDIDATE_ID) ON DELETE NO ACTION
);

【问题讨论】:

  • 请在代码问题中给出minimal reproducible example--剪切&粘贴&运行代码;具有期望和实际输出(包括逐字错误消息)的示例输入(作为初始化代码);标签和版本;明确的规范和解释。对于包含最少代码的错误,您可以给出的代码是您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)对于包含 DBMS 和 DDL 的 SQL,其中包括约束、索引和表格初始化。 PS你有一个语法错误。阅读语法和手册。显示组成子表达式是好的。
  • 您是否尝试删除除名称以外的所有字段并查看是否有效?然后添加字段,直到您可以隔离问题为止。

标签: sql oracle foreign-keys create-table


【解决方案1】:

你需要:

  • YEAR_OF_BIRTH YEAR 更改为有效的数据类型,因为YEAR 不是有效的数据类型。
  • 在要声明外键的列周围加上大括号。
  • ON DELETE NO ACTION 不是 syntactically correct。如果被引用的项目被删除,则您不能不采取任何行动,因为这样就会违反约束;相反,您需要将值设置为NULL 或使用CASCADE 删除记录,或者如果您不希望父记录在此子项存在并引用父项时能够被删除,则省略ON DELETE 子句。

像这样:

CREATE TABLE USERS (
  USER_ID       NUMBER(5) PRIMARY KEY,
  NAME          VARCHAR2(255), 
  YEAR_OF_BIRTH NUMBER(4), 
  SEX           CHAR(2), 
  ADDRESS       VARCHAR2(255), 
  PHONE_NUMBER  VARCHAR2(20), 
  CA_ID         NUMBER(5),
  FOREIGN KEY ( CA_ID ) REFERENCES CANDIDATE(CANDIDATE_ID ) ON DELETE SET NULL
);

db<>fiddle

【讨论】:

  • YEAR_OF_BIRTH 真的应该是日期,而不是数字。即使应用程序只对年份感兴趣,通过将其声明为 DATE,您也可以避免出现无效值的可能性。我不认识任何出生在 0000 年或 9999 年的人,但是将年份保留为 NUMBER,您会错过让数据库强制执行有效值。
  • 好吧,@EdS,那可能是第 0 年,而不是 0000 年(number 数据类型,嗯?):)
  • @Littlefoot -(脸红):-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多