前回、頂いたコメントで、Sql server のNull値の扱いで、軽いショックを受けました。そのついでに、気になることができたので確認してみました。
性別項目に Check制約を付けいてるとき、
性別 nchar(1) CONSTRAINT C1 check (性別 in ( 'F','M'))
大量に入力するとき、Check制約を外したい要求があります。
Oracle だと
ALTER TABLE test DISABLE CONSTRAINT C1;
ALTER TABLE test ENABLE CONSTRAINT C1;
で操作できます。
SQL Serverだと
ALTER TABLE test NOCHECK CONSTRAINT C1;
ALTER TABLE test CHECK CONSTRAINT C1;
で操作できます。
しかし、チェックを無効にして、 'F','M' 以外の値を挿入して、再度、制約を有効にしたときの動作が異なることに気付きました。
Oracleは、制約の復活時に
ENABLE CONSTRAINT C1
*
行2でエラーが発生しました。:
ORA-02293: (SCOTT.C1)を検証できません - チェック制約違反です。
となって、復活が拒否されます。
ところろか、SQL Serverのほうは、違反する行は温存したまま、制約復活できました。
うーん。こんなところにも、方言仕様があったとは。
異なるRDBだから、方言の問題ではなく、たまたま、同じ動きをする部分もある。と認識したほうがいいようですね。
特定RDBに依存した作りにしてなくても、知らぬ間に、依存仕様を使ってことも多いようで、一度構築した、RDBシステムは、異なるRDBに乗せ換えるのは、無謀なのかも知れませんね。
参考: SQL Serverでのソース
drop table test;
create table test
(
id nchar(1)
, 名前 nvarchar(20)
, 性別 nchar(1) CONSTRAINT C1 check (性別 in ( 'F','M'))
);
ALTER TABLE test NOCHECK CONSTRAINT C1;
insert into test (id , 名前 ,性別) values ('a' , 'AA' , 'F');
insert into test (id , 名前 ,性別) values ('b' , 'BB' , 'M');
insert into test (id , 名前 ,性別) values ('c' , 'CC' , 'a');
insert into test (id , 名前 ,性別) values ('d' , 'DD' , 'b');
ALTER TABLE test CHECK CONSTRAINT C1;
insert into test (id , 名前 ,性別) values ('e' , 'EE' , 'e');
select * from test;
Oracleでのソース
drop table test;
create table test
(
id nchar(1)
, 名前 nvarchar2(20)
, 性別 nchar(1) constraint C1 check ( 性別 in ( 'F','M'))
);
ALTER TABLE test
DISABLE CONSTRAINT C1
;
insert into test (id , 名前 ,性別) values ('a' , 'AA' , 'F');
insert into test (id , 名前 ,性別) values ('b' , 'BB' , 'M');
insert into test (id , 名前 ,性別) values ('c' , 'CC' , 'a');
insert into test (id , 名前 ,性別) values ('d' , 'DD' , 'b');
ALTER TABLE test
ENABLE CONSTRAINT C1
;
insert into test (id , 名前 ,性別) values ('e' , 'ee' , 'z');
select * from test;