DB2和Oracle中唯一約束和唯一索引對比
db2創建唯一性約束:
db2 => connect to sample 數據庫連接信息
數據庫服務器 = DB2/NT 10.1.0 SQL
授權標識 = ADMINIST... 本地數據庫別名 = SAMPLE
創建表db2admin.test,允許字段id為空。
www.2cto.com
從下面的過程可以看出,db2中的唯一性約束不允許列值為空。
db2 => create table db2admin.test(id int) DB20000I SQL 命令成功完成。
db2 => alter table db2admin.test add constraint unique_test_id
unique(id) DB21034E 該命令被當作 SQL 語句來處理,
因為它是無效的“命令行處理器”命令。
在 SQL 處理期間,它返回:
SQL0542N 名為 "ID" 的列不能是主鍵或者唯一鍵約束的列,因為它可以包含空值。
SQLSTATE=42831 db2 => alter table db2admin.test alter column
id set not null DB20000I SQL 命令成功完成。 www.2cto.com
db2 => alter table db2admin.test add constraint unique_
test_id unique(id) DB21034E 該命令被當作 SQL 語句來處理,
因為它是無效的“命令行處理器”命令。在 SQL 處理期間,它返回:
SQL0668N 不允許對表 "DB2ADMIN.TEST" 執行操作,原因碼為 "7"。
SQLSTATE=57016 db2 => reorg table db2admin.test DB20000I REORG 命令成功完成。
db2 => alter table db2admin.test add constraint unique_test_id
unique(id) DB20000I SQL 命令成功完成。 DB2創建唯一性索引,從下面過程可以看出,
唯一性索引允許字段為空,但是只允許有一個null值。 db2 => drop table db2admin.test DB20000I SQL 命令成功完成。
db2 => create table db2admin.test(id int) DB20000I SQL 命令成功完成。
db2 =>create unique index idx_test_id on db2admin.test(id) DB20000I SQL命令成功完成。
db2 => insert into db2admin.test values(null) DB20000I SQL 命令成功完成。
db2 => insert into db2admin.test values(null) DB21034E 該命令被當作 SQL 語句來處理,因為它是無效的“命令行處理器”命令。
在 SQL 處理期間,它返回: SQL0803N INSERT 語句、UPDATE 語句或由 DELETE 語句導致的外鍵更新中的一個或多個值無效,因為由 "1" 標識的主鍵、唯一約束或者唯一索引將表 "DB2ADMIN.TEST" 的索引鍵限制為不能具有重復值。
SQLSTATE=23505 Oracle中唯一約束: 從下面測試過程來看,Oracle中唯一約束允許字段為空,並且Oracle會認為null值互不相等。 www.2cto.com
SQL> create table test(id number); 表已創建。
SQL> alter table test add constraint unique_test_id unique (id); 表已更改。
SQL> insert into test values(null); 已創建 1 行。
SQL> insert into test values(null); 已創建 1 行。
SQL> commit; 提交完成。
Oracle唯一索引: 從下面測試過程來看,Oracle中唯一約束也允許字段為空值,
並且Oracle會認為null值互不相等。
SQL> drop table test; 表已刪除。
SQL> create table test(id number); 表已創建。
SQL> create unique index idx_test_id on test(id); 索引已創建。
SQL> insert into test values(null); 已創建 1 行。
SQL> insert into test values(null); 已創建 1 行。
SQL> commit; 提交完成。
綜上,Oracle和DB2中唯一性約束和唯一索引的區別: database
唯一約束 唯一索引 Oracle 允許多個null 允許多個null DB2
不允許為null 允許最多一個null