Oracle SQL 创建 Table 说缺少括号?看不见
Oracle SQL Create Table Says Missing Parenthesis? Can't see it
我正在尝试创建某个 table 但我从 Oracle 收到此错误:
ORA-00907: missing right parenthesis
我试图查找它,但没有找到类似的东西...
这就是我想要做的:
CREATE TABLE Employees
(
EMPLOYEE_ID NUMBER NOT NULL GENERATED BY DEFAULT AS IDENTITY,
NAME VERCHAR2(30) NOT NULL,
PHONE_NUMBER VARCHAR(12) CHECK(PHONE_NUMBER LIKE '%%%-%%%-%%%%') NOT NULL,
SALARY NUMBER NOT NULL,
SENIORITY NUMBER NOT NULL,
PRIMARY KEY(EMPLOYEE_ID)
);
你有几个问题:
- 正如@GordonLinoff 在评论中指出的那样,
VERCHAR2
是一个错字,应改为 VARCHAR2
;
- 正如@TimBiegeleisen 在他(现已删除)的回答中指出的那样,您的
CHECK
约束允许将其中包含两个连字符的任何值(例如 x-y-z
)插入到 phone 号。你应该使用他建议的东西,即
REGEXP_LIKE(PHONE_NUMBER, '\d{3}-\d{3}-\d{4}')
- 最后,也是错误的实际原因,
EMPLOYEE_ID
上的 NOT NULL
声明应该是 在 之后 GENERATED
子句,而不是在它之前。请注意,如果插入 NULL
,您实际上可能希望
GENERATED BY DEFAULT ON NULL AS IDENTITY
插入标识值(而不是像当前定义那样生成错误)
您的查询应该是:
create table Employees
(
EMPLOYEE_ID NUMBER GENERATED BY DEFAULT AS IDENTITY NOT NULL,
NAME VARCHAR2(30) NOT NULL,
PHONE_NUMBER VARCHAR(12) CHECK(REGEXP_LIKE(PHONE_NUMBER, '\d{3}-\d{3}-\d{4}')) NOT NULL,
SALARY NUMBER NOT NULL,
SENIORITY NUMBER NOT NULL,
PRIMARY KEY(EMPLOYEE_ID)
);
这是一个 demo on dbfiddle,它也显示了使用 GENERATED BY DEFAULT ON NULL AS IDENTITY
而不是 GENERATED BY DEFAULT AS IDENTITY NOT NULL
的效果。
我正在尝试创建某个 table 但我从 Oracle 收到此错误:
ORA-00907: missing right parenthesis
我试图查找它,但没有找到类似的东西...
这就是我想要做的:
CREATE TABLE Employees
(
EMPLOYEE_ID NUMBER NOT NULL GENERATED BY DEFAULT AS IDENTITY,
NAME VERCHAR2(30) NOT NULL,
PHONE_NUMBER VARCHAR(12) CHECK(PHONE_NUMBER LIKE '%%%-%%%-%%%%') NOT NULL,
SALARY NUMBER NOT NULL,
SENIORITY NUMBER NOT NULL,
PRIMARY KEY(EMPLOYEE_ID)
);
你有几个问题:
- 正如@GordonLinoff 在评论中指出的那样,
VERCHAR2
是一个错字,应改为VARCHAR2
; - 正如@TimBiegeleisen 在他(现已删除)的回答中指出的那样,您的
CHECK
约束允许将其中包含两个连字符的任何值(例如x-y-z
)插入到 phone 号。你应该使用他建议的东西,即REGEXP_LIKE(PHONE_NUMBER, '\d{3}-\d{3}-\d{4}')
- 最后,也是错误的实际原因,
EMPLOYEE_ID
上的NOT NULL
声明应该是 在 之后GENERATED
子句,而不是在它之前。请注意,如果插入NULL
,您实际上可能希望GENERATED BY DEFAULT ON NULL AS IDENTITY
插入标识值(而不是像当前定义那样生成错误)
您的查询应该是:
create table Employees
(
EMPLOYEE_ID NUMBER GENERATED BY DEFAULT AS IDENTITY NOT NULL,
NAME VARCHAR2(30) NOT NULL,
PHONE_NUMBER VARCHAR(12) CHECK(REGEXP_LIKE(PHONE_NUMBER, '\d{3}-\d{3}-\d{4}')) NOT NULL,
SALARY NUMBER NOT NULL,
SENIORITY NUMBER NOT NULL,
PRIMARY KEY(EMPLOYEE_ID)
);
这是一个 demo on dbfiddle,它也显示了使用 GENERATED BY DEFAULT ON NULL AS IDENTITY
而不是 GENERATED BY DEFAULT AS IDENTITY NOT NULL
的效果。