CREATE TABLE 中的 DEFAULT 上的“缺少右括号”

Posted

技术标签:

【中文标题】CREATE TABLE 中的 DEFAULT 上的“缺少右括号”【英文标题】:"Missing right parenthesis" on DEFAULT in a CREATE TABLE 【发布时间】:2018-12-30 02:10:21 【问题描述】:

在表 Aposta 中,每当我插入新行而不是 null 时,我希望 CodEstadoAposta 的值默认为 0,但这会一直显示在脚本输出中:

"错误报告- ORA-00907: 缺少右括号 00907. 00000 - “缺少右括号” *原因: *行动:"

表背标:

CREATE TABLE Aposta (
CodAposta Number(10) Primary key,
data DATE default sysdate not null,
hora VARCHAR2(5) not null, 
valor Number(10,2) not null,
quotaTotal Number(10,2)  not null,
CodTipoAposta references TipoAposta(CodTipoAposta) not null,
CodEstadoAposta references EstadoAposta(CodEstadoAposta) default '0' not null
);

如果有帮助,请表 EstadoAposta 和 TipoAposta:

CREATE TABLE EstadoAposta (
CodEstadoAposta Number(1) Primary key
  check (CodEstadoAposta in ('0','1','2')),
desc_EstadoAposta VARCHAR2(20) not null
);

CREATE TABLE TipoAposta (
CodTipoAposta Number(1) Primary key
  check (CodTipoAposta in ('0','1')),
desc_TipoAposta VARCHAR2(20) not null
); 

编辑:

这显示:default syntax error - 默认后有“1”,但这只是我测试。

【问题讨论】:

默认为零不需要引号,除非它是 varchar2 列 仍然“缺少右括号” 正如 Schern 所指出的,您需要在“引用”一词之前为这些列中的每一列提供一个数据类型,我在 '0' 上的注释只是额外的 【参考方案1】:

所有列都需要数据类型:例如

CREATE TABLE Aposta (
    CodAposta Number(10) PRIMARY KEY
  , data date DEFAULT sysdate NOT NULL
  , hora VARCHAR2(5) NOT NULL
  , valor Number(10, 2) NOT NULL
  , quotaTotal Number(10, 2) NOT NULL
  , CodTipoAposta number(1) NOT NULL --references TipoAposta(CodTipoAposta)
  , CodEstadoAposta number(1) DEFAULT 0 --references EstadoAposta(CodEstadoAposta) 
);

db小提琴here

由于我没有这些表,所以对引用进行了注释,因此使用的数据可能不正确

【讨论】:

【参考方案2】:

我通过 Postgresql 运行此程序,针对 Postgres 类型稍作修改,以获得更好的诊断。

test=> CREATE TABLE Aposta (
test(>     CodAposta decimal(10) Primary key,
test(>     data DATE default sysdate not null,
test(>     hora varchar(5) not null, 
test(>     valor decimal(10,2) not null,
test(>     quotaTotal decimal(10,2)  not null,
test(>     CodTipoAposta references TipoAposta(CodTipoAposta) not null,
test(>     CodEstadoAposta references EstadoAposta(CodEstadoAposta) default '0' not null
test(> );
ERROR:  syntax error at or near "references"
LINE 7:     CodTipoAposta references TipoAposta(CodTipoAposta) not n...

每列都需要一个名称、类型和可选约束。 references ... 是一个约束。它缺少应该与其引用的列的类型匹配的类型。

此外,Oracle 似乎是extremely particular about the order of constraints。 default 必须出现在类型之后和任何约束之前。

CodTipoAposta number (1) not null references TipoAposta(CodTipoAposta),
CodEstadoAposta number(1) default '0' not null references EstadoAposta(CodEstadoAposta)

见db<>fiddle。

Oracle 似乎严格遵循SQL standard grammar for a column definition,其中defaultreferencesnot null 等列约束分开。大多数 SQL 实现使用更宽松的语法,其中 default 被视为列约束。

【讨论】:

试过了,没用。线程编辑中的图像仍然出现。也许这只是 PostgreSQL 的事情。 @LyZ4RD 这是缺少的类型,但 Oracle 似乎对其约束的顺序非常特别。似乎default 必须紧跟在类型之后。【参考方案3】:

我相信你想要的是:

CREATE TABLE Aposta (
    CodAposta Number(10) Primary key,
    data DATE default sysdate not null,
    hora VARCHAR2(5) not null, 
    valor Number(10,2) not null,
    quotaTotal Number(10,2)  not null,
    CodTipoAposta not null references TipoAposta(CodTipoAposta),
    CodEstadoAposta varchar2(1) default '0' references EstadoAposta(CodEstadoAposta) 
);

请注意,当有外键引用时,需要为列声明类型。我还将外键引用作为列的最后一个条件。

【讨论】:

似乎列default 子句依赖于数据类型定义,尽管我在文档中看不到这一点(语法铁路图等)。否则,可以允许数据类型从父级继承,如CodTipoAposta。此外,如果在 12.1 或更高版本上,我发现 default on null 有所改进(并且它隐式设置了列 not null)。

以上是关于CREATE TABLE 中的 DEFAULT 上的“缺少右括号”的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 db2 中的 create table 语句本身中定义索引?

数据库“tempdb”中的 CREATE TABLE 权限被拒绝

谁能给个SQL中用CREATE TABLE 创建数据库表的建表事例,急

when create a table,then show error ora-00952 tablespace tsb_1 not exist

存储As()在Laravel中生成的列(MySQL)中的错误

Laravel 迁移默认值