如何在 Oracle SQL 中添加命名约束?

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 identifierNOT NULL零件上产生。为什么?

ste*_*fan 8

甲骨文 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)