报错‘constraint specification not allowed here’:命名与匿名CHECK约束区别咨询
SQL约束报错及两种Quantity字段定义的区别
报错背景
执行创建Bill表的SQL语句时,触发错误提示 constraint specification not allowed here(此处不允许约束规范),原SQL代码如下:
create table Bill ( BillNo NUMBER PRIMARY KEY, StoreName varchar2(20) constraint bill_sname_fk references Store(StoreName), Shopperid NUMBER constraint bill_sis_fk references Shopper(ShopperId), ArCode CHAR(5) constraint bill_acode_fk references Article(ArCode), Amount NUMBER, BillDate DATE, Quantity NUMBER(4) DEFAULT 1 constraint bill q_ck check(Quantity>1) );
注:原SQL中reference应为references,这也是一处语法问题
两种Quantity字段定义的核心区别
1. Quantity NUMBER(4) DEFAULT 1 constraint bill q_ck check(Quantity>1)
- 意图为CHECK约束指定自定义名称,但写法存在语法错误:约束名
bill q_ck包含空格,违反SQL标识符命名规则(标识符不允许直接带空格,部分数据库支持用双引号包裹带空格的名称,但不推荐),这正是触发报错的直接原因。 - 若修正约束名(例如改为
bill_q_ck),该语句会创建一个名为bill_q_ck的CHECK约束,后续可通过这个名称单独对约束进行修改、删除等操作,便于管理。
2. Quantity NUMBER(4) DEFAULT 1 check(Quantity>1)
- 未给CHECK约束指定名称,属于隐式命名。数据库会自动为该约束生成一个系统默认名称(比如Oracle中会生成
SYS_C00XXXXXX格式的名称)。 - 后续管理该约束时,只能通过系统生成的默认名称操作,不如显式命名的约束直观,维护成本更高。
内容的提问来源于stack exchange,提问作者saurabh kumar
相关产品推荐
相关产品推荐

