web-dev-qa-db-ja.com

Oracle SQLで名前付き制約を追加するにはどうすればよいですか?

テーブルがあります。列の1つに_NOT NULL_制約を追加する必要があります。これは解決策での私の最善の試みです:

alter table clookup add CONSTRAINT lookup_9 NOT NULL (clookup_col)

これにより、_ERROR at line 1: ORA-00904: : invalid identifier_パーツに_NOT NULL_が生成されます。どうして?

5
moonman239

Oracle 12c:

テーブル

create table clookup ( clookup_col varchar2( 64 ) );

NOT NULL制約を追加する

alter table clookup
modify ( clookup_col constraint lookup_9 not null ) ;

オプション

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 

補遺

常にALTER TABLE ... MODIFY ...テクニックを使用する必要があるとは限りません。 NOT NULL制約を定義するための「特別なルール」があります( ドキュメント を参照):

制約は、次の2つの方法で構文的に定義できます。

個々の列または属性の定義の一部として。これをインライン仕様といいます。

テーブル定義の一部として。これは、アウトオブライン仕様と呼ばれます。

NOT NULL制約はインラインで宣言する必要があります。他のすべての制約は、インラインまたはライン外で宣言できます。

また、( ここ ):

ALTER TABLEステートメントを使用して、非パーティション表、パーティション表、表パーティション、または表サブパーティションの定義を変更します。

次の例は、機能しないものを示しています。ALTERTABLE ... 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

ただし、ALTER TABLE ... ADD ...は、他の制約に使用できます。たとえば、UNIQUEやPRIMARY KEYは、「上記の例のように」「行外」です。 「インライン」で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
8
stefan