Oracle

在預設 0 之後(或之前)缺少右括號,Oracle

  • May 23, 2019

我正在嘗試使用 Oracle SQL 創建一個表,其中表的兩列應具有預設值且不應為 NULL。

我收到了您可以在下面看到的錯誤,但我無法理解它,因為那裡沒有括號可以關閉!

劇本

CREATE TABLE ENCUENTROS (
 elocal constraint clave_extrana_equipos references equipos(code) not null enable,
 evisitante constraint clave_extrana_equipos references equipos(code) not null enable,
 fecha date,
 plocal number constraint plocal_mayor_cero check (plocal > 0) default 0 not null enable,
 pvisitante number constraint pvisitante_mayor_cero check (pvisitante > 0) default 0 not null enable);

錯誤資訊

plocal number constraint plocal_mayor_cero check (plocal > 0) default 0 not null enable,
                                                              *
ERROR at line 5:
ORA-00907: missing right parenthesis
  • 是 Oracle 檢測到錯誤的地方

我不知道為什麼那個位置應該有錯誤。

問題在於子句的順序。如果您在子句之後CHECK移動約束,則該表將創建:DEFAULT 0

CREATE TABLE ENCUENTROS (
 elocal constraint clave_extrana_equipos_1 references equipos(code) not null enable,
 evisitante constraint clave_extrana_equipos_2 references equipos(code) not null enable,
 fecha date,
 plocal number default 0 not null enable constraint plocal_mayor_cero check (plocal > 0),
 pvisitante number default 0 not null enable constraint pvisitante_mayor_cero check (pvisitante > 0)
);

或者

CREATE TABLE ENCUENTROS (
 elocal constraint clave_extrana_equipos_1 references equipos(code) not null enable,
 evisitante constraint clave_extrana_equipos_2 references equipos(code) not null enable,
 fecha date,
 plocal number default 0 constraint plocal_mayor_cero check (plocal > 0) not null enable,
 pvisitante number default 0 constraint pvisitante_mayor_cero check (pvisitante > 0) not null enable 
);

請注意,我必須為兩個外鍵約束賦予不同的名稱。

順便說一句,你的定義有點奇怪:你需要一個值localpvisitante如果沒有傳遞,那麼你使用0. 但檢查約束要求值為>0。這意味著任何不提供值的插入都將失敗……錯誤將類似於constraint pvisitante_mayor_cero failed validation或類似。

也許更簡單的方法是刪除該default條款。然後,這將使插入不包含pvisitante失敗並出現不同的錯誤:cannot insert null into ENCUENTROS (PVISITANTE). 這對應用程序開發人員來說可能更清楚。

引用自:https://dba.stackexchange.com/questions/238629