ORA-00933错误求助:Oracle APEX中创建表SQL语句问题
解决ORA-00933: SQL command not properly ended错误
问题根源
你代码里的错误在于表级约束中使用了NOT NULL关键字,Oracle不支持这种语法——NOT NULL只能作为列级约束存在,若要在表级实现非空限制,需要用CHECK约束替代。
你的原始代码里,像CONSTRAINT not_null_customer_last_name NOT NULL (last_name)这种写法完全不符合Oracle的约束定义规则,这就是触发错误的直接原因。
两种修正方案
方案1:列级NOT NULL约束(推荐)
把NOT NULL直接附加在对应列的定义后面,也可以给约束指定名称:
DROP TABLE customers; --1 create tables CREATE TABLE customers ( customer_id NUMBER(10), -- 带约束名的列级非空 last_name VARCHAR2(25) CONSTRAINT not_null_customer_last_name NOT NULL, first_name VARCHAR2(25) CONSTRAINT not_null_customer_first_name NOT NULL, home_phone VARCHAR2(12) CONSTRAINT not_null_customer_home_phone NOT NULL, address VARCHAR2(100) CONSTRAINT not_null_customer_address NOT NULL, city VARCHAR2(30) CONSTRAINT not_null_customer_city NOT NULL, state VARCHAR2(2) CONSTRAINT not_null_customer_state NOT NULL, email VARCHAR2(25), cell_phone VARCHAR2(12), CONSTRAINT pk_customer_customer_id PRIMARY KEY (customer_id) );
如果不需要自定义约束名,可简化写法:
DROP TABLE customers; --1 create tables CREATE TABLE customers ( customer_id NUMBER(10), last_name VARCHAR2(25) NOT NULL, first_name VARCHAR2(25) NOT NULL, home_phone VARCHAR2(12) NOT NULL, address VARCHAR2(100) NOT NULL, city VARCHAR2(30) NOT NULL, state VARCHAR2(2) NOT NULL, email VARCHAR2(25), cell_phone VARCHAR2(12), CONSTRAINT pk_customer_customer_id PRIMARY KEY (customer_id) );
方案2:表级CHECK约束替代NOT NULL
如果一定要用表级约束的形式,将NOT NULL替换为CHECK(列名 IS NOT NULL):
DROP TABLE customers; --1 create tables CREATE TABLE customers ( customer_id NUMBER(10), last_name VARCHAR2(25), first_name VARCHAR2(25), home_phone VARCHAR2(12), address VARCHAR2(100), city VARCHAR2(30), state VARCHAR2(2), email VARCHAR2(25), cell_phone VARCHAR2(12), CONSTRAINT pk_customer_customer_id PRIMARY KEY (customer_id), CONSTRAINT not_null_customer_last_name CHECK (last_name IS NOT NULL), CONSTRAINT not_null_customer_first_name CHECK (first_name IS NOT NULL), CONSTRAINT not_null_customer_home_phone CHECK (home_phone IS NOT NULL), CONSTRAINT not_null_customer_address CHECK (address IS NOT NULL), CONSTRAINT not_null_customer_city CHECK (city IS NOT NULL), CONSTRAINT not_null_customer_state CHECK (state IS NOT NULL) );
关于你之前尝试列级约束未解决的推测
如果之前改列级约束没生效,大概率是修改时没彻底移除错误的表级NOT NULL约束,或者列级约束的写法有误(比如没把NOT NULL放在列定义后面)。
内容的提问来源于stack exchange,提问作者user17654954
相关产品推荐
相关产品推荐

