moo*_*239 5 null oracle constraint syntax
我有一张桌子。我需要向NOT NULL其中一列添加约束。这是我对解决方案的最佳尝试:
alter table clookup add CONSTRAINT lookup_9 NOT NULL (clookup_col)
这ERROR at line 1: ORA-00904: : invalid identifier在NOT NULL零件上产生。为什么?
甲骨文 12c:
桌子
create table clookup ( clookup_col varchar2( 64 ) );
Run Code Online (Sandbox Code Playgroud)
添加 NOT NULL 约束
alter table clookup
modify ( clookup_col constraint lookup_9 not null ) ;
Run Code Online (Sandbox Code Playgroud)
可选的
select
table_name
, constraint_name
, constraint_type
from user_constraints
where table_name = 'CLOOKUP' ;
-- result
TABLE_NAME CONSTRAINT_NAME CONSTRAINT_TYPE
CLOOKUP LOOKUP_9 C
Run Code Online (Sandbox Code Playgroud)
附录
可能并不总是需要使用 ALTER TABLE ... MODIFY ... 技术。定义 NOT NULL 约束有一个“特殊规则”(参见文档):
您可以通过两种方式在语法上定义约束:
作为单个列或属性定义的一部分。这称为内联规范。
作为表定义的一部分。这称为线外规范。
NOT NULL 约束必须内联声明。所有其他约束都可以声明为内联或外联。
还有(这里):
使用 ALTER TABLE 语句更改非分区表、分区表、表分区或表子分区的定义。
以下示例显示什么不起作用:只需通过 ALTER TABLE ... ADD ...(外线)向表添加 NOT NULL 约束(不是列)。
-- Oracle 12c
create table T ( name varchar2( 32 ) ) ;
alter table T
add constraint name_nn not null ( name ) ;
-- ORA-00904: : invalid identifier
alter table T
add (
n number
, constraint name_nn not null ( name ) -- out-of-line
) ;
-- ORA-00904: : invalid identifier
Run Code Online (Sandbox Code Playgroud)
不过,ALTER TABLE ... ADD ... 可用于其他约束,例如 UNIQUE 或 PRIMARY KEY “out-of-line”(如上例所示)。当我们想要“内联”添加 NOT NULL 约束时,即指定列和约束时,它也适用,例如
create table T ( name varchar2( 32 ) ) ;
alter table T
add n number not null ;
-- Table T altered
-- or
alter table T
add n number constraint number_nn not null ;
-- Table T altered
Run Code Online (Sandbox Code Playgroud)