作用
約束用於確保數據庫數據的完整性
分類
約束的種類有
Not null確保字段值不能為空
Unique:確保字段值唯一性
Primary key
Foreign key:定義了主從表之間的關系
Check::用於強制表行數據必須滿足的條件
約束狀態
enable validate:是默認
enable novalidate:舊數據可以不滿足
disable validate:不允許在表上執行任何DML操作
disable novalidate數據可不滿足約束規則
約束常用語句
create table t(i number
create table t(i number
create table t(i number constraint pk_i primary key
create table t
alter table t add constraint pk_i primary key (i)
alter table t modify i not null;
alter table t add constraint t_i unique(i)[(create index ind_name on t(i))];
alter table t add constraint t_i check(i in (
alter table t disable novalidate constraint i
alter table t enable novalidate constraint check_i
alter table t drop constraint i;
alter table t drop primary key i;
#常用的數據字典
dba_constraints
dba_cons_columns
user_cons_columns
user_constraints
簡單應用
檢驗當為一個表建立主鍵索時後
SQL> create table t(i number constraint pk_i primary key
SQL> insert into t values(
SQL> insert into t values(
SQL> commit;
SQL> select * from t;
I V
現在表中有兩條記錄
SQL> insert into t values(
ERROR at line
ORA
SQL> insert into t values(
ERROR at line
ORA
可以看到全部報錯
查看是否建立索引
SQL> select index_name from user_indexes;
INDEX_NAME
PK_I
把約束關閉再次做同樣的操用
SQL> alter table t disable novalidate constraint pk_i;
Table altered
SQL> insert into t values(
SQL> insert into t values(
SQL> commit;
Commit complete
SQL> select * from t;
I V
SQL> select index_name from user_indexes;
no rows selected
可見當把約束關閉後就可以何意給表插數據了
現在激活約束
SQL> alter table t enable validate constraint pk_i;
alter table t enable validate constraint pk_i
ERROR at line
ORA
因為表中主鍵有相同的值所以不能恢復到enable validate狀態了
再次測試回復到enable novalidate
SQL> alter table t enable novalidate constraint pk_i;
alter table t enable validate constraint pk_i
ERROR at line
ORA
也失敗了
因為表中主鍵有了空值和相同的值
要想恢復到enable novalidate必須建立主鍵索引(關閉約束時自動刪除的那個索引)如下:
SQL> create index pk_i on t(i);
Index created
然後恢復到enable disvalidate
SQL> alter table t enable novalidate constraint pk_i;
Table altered
SQL> insert into t values(
insert into t values(
ERROR at line
ORA
當給一個表作主鍵約束時
要修正數據先找出不滿足約束的數據
如下表
SQL> select * from t;
I V
如果一個表數據量多可通過如下方法查找
SQL> alter table t drop constraint pk_i;
Table altered
SQL>conn y /
SQL> @$ORACLE_HOME/rdbms/admin/utlexcpt
Table created
SQL> alter table t add constraint pk_i primary key (i) exceptions into exceptions;
select * from t where rowid in (select row_id from exceptions)
I V
找到了重復的記錄
修正
SQL>update t set i=
SQL> select * from t;
I V
再建主鍵約束
alter table t add constraint pk_i primary key (i)
Table altered
成功了!!!
二:分區表管理
作用:將在張大表的數據分布到多個表分區段
種類:范圍分區
范圍分區表
創建范圍分區表
create table t(v number
partition by range(v) (
partition p
partition p
增加與刪除分區
#增加分區
alter table t add partition p
alter table t drop partition p
一個時間分區的例子
alter session set nls_data_lanage=AMERICAN;
alter session set nls_data_format=
create table t(v_date date
partition by range(v_date)(
partition p
partition p
創建
create table t
v number
partition by hash(v)
(partition p
partition p
增加分區
alter table t add partition p
刪除分區
alter table t drop coalesce partition;
建列表分區
create table t(
v varchar
b number
)partition by list(v)
(partition p
partition p
#插入數據
SQL> insert into t values(
SQL> insert into t values(
#注意
SQL> insert into t values(
ERROR at line
ORA
#查詢
select * from t;
select * from t partition(p
select * from t partition(p
select * from t where v=XXX
增加分區
alter table t add partition p
刪除分區
alter table t drop partition p
建立散列組合分區
create table t(
v number
partition by range(v)
subpartition by hash(b) subpartitions
store in (test
partition p
partition p
查詢
select * from t;
select * from t partition(p
select * from t where
增加主分區和子分區
alter table t add partition p
alter table t modify partition p
刪除分區
alter table t coalesce partition;
alter table t modify partition p
創建
create table t(
v number
partition by range(v)
subpartition by list(b)
(partition p
subpartition p
subpartition p
)
partition p
subpartition p
subpartition p
));
查詢
select * from t
select * from t partition(p
select * from t subpartition(p
select * from t where
select segment_name
from user_segments where segment_name=
增加分區和子分區
alter table t add partition p
subpartition p
subpartition p
alter table t modify partition r
add subpartition r
刪除分區
alter table t modify partition p
其它設置
交換分區數據
alter table t exchange partition p
載斷分區
alter table t truncate partition p
修改分區名
alter table t rename partition p
合並分區
alter table t merge partitions p
重組分區
alter table t move partition p
為列表分區和子分區加值
alter table t modify partition p
alter table t modify subpartition p
從列表分區和子分區中刪除值
alter table t modify partition p
alter table t modify subpartition p
分區表常用的數據字典
分區表信息: dba_part_tables
顯示分區: dba_tab_partitions
顯示子分區: dba_tab_subpartitions
顯示分區列: dba_part_key_columns
顯示子分區列:dba_subpart_dey_columns
顯示分區索引:dba_part_indexes
顯示索引分區:dba_ind_partitions
From:http://tw.wingwit.com/Article/program/Oracle/201311/16778.html