oracle9i學習筆記之九 約束

 1.約束類型
  NOT NULL----指定列不能包含空值
  UNIQUE-----指定列的值或者列的組合的值對於表中所有的行必須是唯一的
  PRIMARY KEY----表的每行的唯一性標識
  FOREIGN KEY----在列和表引用表的一個列之間建立並強制一個外鍵關係
  CHECK----指定一個必須爲真的條件

2.約束原則
  1)命名一個約束,必須按照命名規則。如果不命名約束,Oracle服務器將用SYS_Cn格式產生一個名字,這裏n是一個唯一的整數,所以約束名是唯一的。
  2)可以在創建表的同時,或者創建表之後創建一個約束
  3)在列或者表級定義一個約束
  4)在數據字典USER_CONSTRAINTS中查看約束
 
3.定義約束
  CREATE TABLE [schema.]table
               (column datatype [DEFAULT expr]
                [column_constraint],
                ...
                [table_constraint]);
  CREATE TABLE emp(
                   empno NUMBER(4),
                   ename VARCHAR2(10),
                   ...
                   deptno NUMBER(7,2) NOT NULL,
                   CONSTRAINT emp_empno_pk PRIMARY KEY (empno));

1)列約束級:只能引用一個列,屬於列定義
  column [CONSTRAINT constraint_name] constraint_type,

2)表約束級:可引用一個或多個列,屬於表定義,可以定義爲除NOT NULL以外的約束
  column,...
          [CONSTRAINT constraint_name] constraint_type
          (column,...),

3)約束通常在創建表的同時被創建,在表創建後約束能被添加,且約束可被臨時禁用
  約束可以在兩個級別上定義:
 
   約束級別                           說明
      列           只涉及一個單個的列,對該列用規範定義;
                   能夠定義完整性約束的任何類型
      表           涉及一個或多個列,表中的列被分別定義;
                   除了NOT NULL,能夠定義任何約束

4.NOT NULL約束
  -確保某些列不允許空值:
    -NOT NULL約束:對該列來說沒有行能夠包含一個空值
    -缺少NOT NULL約束:對於該列來說任何行都能包含空值
  -NOT NULL約束確保列不包含控制。默認情況下,沒有此約束,可包含空值

  例1:在列一級上定義約束
       CREATE TABLE emp(
              empno     NUMBER(4),
              ename     VARCHAR2(10) NOT NULL,
              job       VARCHAR2(9),
              mgr       NUMBER(4),
              hiredate  DATE,
              sal       NUMBER(7,2),
              comm      NUMBER(7,2),
              deptno    NUMBER(7,2) NOT NULL);

5.UNIQUE約束
  -UNIQUE完整性約束要求在表中指定的列或列組合中不能有兩行相同的值。定義UNIQUE約束的列(或列組合)被稱爲唯一鍵(unique key)
  -除非我們在相應列上定義了NOT NULL約束,否則UNIQUE約束允許輸入空值
  -UNIQUE可以在列級也可以在表級定義

  例1:定義在表一級
      CREATE TABLE deptment(
             deptno     NUMBER(2),
             dname      VARCHAR2(14),
             loc        VARCHAR2(13),
             CONSTRAINT dept_dname_uk UNIQUE(dname));

  例2:定義在列一級
       CREATE TABLE deptment(
              deptno  NUMBER(2),
              dname   VARCHAR2(14) CONSTRAINT dept_dname_uk UNIQUE,
              loc     VARCHAR2(13));

6.PRIMARY KEY約束
  -PRIMARY KEY約束爲表創建一個主鍵
  -每個表只能創建一個主鍵
  -PRIMARY KEY約束是表中對行唯一標識的一個列或列組合,該約束強制列或列組合的唯一性
  -主鍵列不能包含空值
  -可定義在表一級或列一級
 
  例1:定義在表一級
       CREATE TABLE deptment(
              deptno     NUMBER(2),
              dname      VARCHAR2(14),
              loc        VARCHAR2(13),
              CONSTRAINT dept_dname_uk UNIQUE(dname),
              CONSTRAINT dept_deptno_pk PRIMARY KEY(deptno));

  例2:定義在列一級
       CREATE TABLE deptment(
              deptno     NUMBER(2) CONSTRAINT dept_deptno_pk PRIMARY KEY,
              dname      VARCHAR2(14),
              loc        VARCHAR2(13),
              CONSTRAINT dept_dname_uk UNIQUE(dname));

7.FOREIGN 約束 
  -可定義在表或列一級
  例:列一級約束:
      CREATE TABLE emp(
             empno    NUMBER(4),
             ename    VARCHAR2(10) NOT NULL,
             job      VARCHAR2(9),
             mgr      NUMBER(4),
             hiredate DATE,
             sal      NUBMER(7,2),
             comm     NUMBER(7,2),
             deptno   NUMBER(7,2) NOT NULL
               CONSTRAINT emp_deptno_fk REFERENCES dept(deptno));
  -FOREIGN KEY:在表或列約束級別
  -REFERENCES:標識父表和父表中列
  -ON DELETE CASCADE:當父表中的行被刪除時,刪除子表中相依賴的行
  -ON DELETE SET NULL:當父表的值被刪除時,轉換外鍵值爲空
  -在無ON DELETE CASCADE或ON DELETE SET NULL選項時,若父表中的行在子表中引用,那麼它不能被刪除
 
  例:ON DELETE CASCADE選項
      CREATE TABLE test(
             empno      NUMBER(4),
             ename      VARCHAR2(10) NOT NULL,
             deptno     NUMBER(7,2) NOT NULL
             CONSTRAINT emp_deptno_fk
                        REFERENCES dept(deptno)
                        ON DELETE CASCADE);

8.CHECK約束
  -CHECK約束定義一個每行都必須滿足的條件,該條件可以使用和查詢條件一樣的結構
   salary NUMBER(8,2) CONSTRAINT
   department_salary_min CHECK(salary>0),
   ...
  -不允許使用下面的表達式:
     -引用CURRVAL,NEXTVAL,LEVEL和ROWNUM僞列
     -調用SYSDATE,UID,USER和UDERENV函數
     -涉及其它行的值

9.改變約束
  用ALTER TABLE語句:
  -添加或刪除玉樹,但不修改它的結構
  -啓用或禁用約束
  -用MODIFY子句添加一個NOT NULL約束

1)添加約束
  ALTER TABLE table
    ADD [CONSTRAINT constraint] type (column);
  其中:
       table----表的名字
       constraint----約束的名字
       type----約束的類型
       column----受約束影響的列的名字

  例1:添加一個約束到emp表,要求薪水大於零
       ALTER TABLE emp
         ADD CONSTRAINT emp_sal
         CHECK (sal>0);
 
  例2:添加一個FOREIGN KEY約束到emp表,指示經理必須已經是emp表中的職員
       ALTER TABLE emp
         ADD CONSTRAINT emp_mgr_fk
         FOREIGN KEY(mgr)
         REFERENCES emp (empno);

  可以用ALTER TABLE語句的MODIFY子句添加一個NOT NULL約束到一個已經存在的列
  例:
     ALTER TABLE emp
       MODIFY (salary CONSTRAINT emp_salary_nn NOT NULL);
  注:只有在表示空的或者每個行的該列都有非空值的情況下,纔可以定義NOT NULL

2)查看約束
  -數據字典user_constraints
   SELECT table_name,constraint_name,constarint_type,status
   FROM   user_constraints
   WHERE  table_name='EMP';  //表名必須大寫

  -在constraint_type中,C代表CHECK,P代表PRIMARY KEY,R代表引用完整性,U代表UNIQUE鍵。NOT NULL 在數據字典中被作爲CHECK約束存儲
  
  -可用USER_CONS_COLUMNS數據字典視圖查看與約束相關的列名。該視圖對於由系統指定名字的約束特別有用

   SELECT constant_name,column_name
   FROM   user_cons_columns
   WHERE  table_name='EMP';

3)禁用約束
  語法:
   ALTER TABLE teble
     DISABLE CONSTRAINT constraint [CASCADE];
  其中:
       table----表名
       constraint----約束名
  注:既可以在CREATE TABLE也可以在ALTER TABLE語句中使用DISABLE子句
      CASCADE子句禁用想依賴的完整性約束

  例:ALTER TABLE test_p
        DISABLE CONSTRAINT test_deptno_pk CASCADE;
  -執行ALTER TABLE語句的DISABLE子句禁用完整性約束,可以禁用一個約束而不刪除它
  -應用CASCADE選項禁用想依賴的完整性約束
  -禁用唯一鍵或主鍵會移除唯一性索引

4)啓用約束
  語法:
   ALTER TABLE table 
     ENABLE CONSTRAINT constraint;

   例:ALTER TABLE test_p
         ENABLE CONSTRAINT test_deptno_pk;
  -若啓用一個約束, 約束將應用於表中所有數據,所有表中數據都必須適合該約束
  -若啓用一個UNIQE鍵或者PRIMARY KEY約束,一個UNIQUE或PRIMARY KEY索引將被自動地創建
  -既可以在CREATE TABLE也可以在ALTER TABLE語句中使用ENABLE子句
  -啓用一個帶CASCADE選項的被禁用的主鍵約束不會啓用任何依賴於該主鍵的外鍵

5)刪除約束
  語法:
  ALTER TABLE table
    DROP PRIMARY KEY | UNIQUE(column)|
      CONSTRAINT constraint [CASCADE];
  其中:
       table----表名
       column----受約束影響的列的名字
       constraint----約束的名字
       CASCADE選項導致任何與其相依賴的約束也被刪除

  例1:從emp表中刪除經理約束
      ALTER TABLE emp
        DROP CONSTRAINT emp_mgr_fk;

  例2:刪除test_p表上的PRIMARY KEY約束,並刪除相關聯的在test_f.deptno列上的FOREIGN KEY約束
       ALTER TABLE test_p
         DROP PRIMARY KEY CASCADE;
 
  刪除約束步驟:
  -從USER_CONSTRAINTS和USER_CONS_COLUMNS數據字典視圖中確定約束的名字
  -使用帶DROP子句的ALTER TABLE語句
  -DROP子句的CASCADE選項導致任何與其相依賴的約束也被刪除
 
    
練習
1.創建test_f表
  列名  數據類型    長度    主鍵    空否
  id    NUMBER       7      YES
  name  VARCHAR2     25             NOT NULL

   CREATE TABLE test_f
          (id NUMBER(7),
           name VARCHAR2(25) NOT NULL,
           CONSTRAINT test_fid_pk PRIMARY KEY(id));

2.創建test_p表
  列名       數據類型    長度    主鍵    空否
  deptno     NUMBER       8      YES  
  dept_name  VARCHAR2     25             NOT NULL

   CREATE TABLE test_p
          (deptno NUMBER(8),
           dept_name VARCHAR2(25) NOT NULL,
           CONSTRAINT test_pno_pk PRIMARY KEY(deptno));

3.更改test_f表,增加deptno字段,類型NUMBER,長度8
 
    ALTER TABLE test_f
     ADD (deptno NUMBER(8));

4.添加一個外鍵到test_f表的deptno列上,該外鍵參照test_P表的deptno列,將該約束命名爲my_dept_id_fk

   ALTER TABLE test_f
     ADD CONSTRAINT my_dept_id_fk
         FOREIGN KEY(deptno)
         REFERENCES test_p(deptno);

5.更改test_f表,增加sal字段,類型爲NUMBER,長度爲7,增加check約束,要求sal>1000
  
   ALTER TABLE test_f
     ADD (sal NUMBER(7),
          CONSSTRAINT test_fsal_c
          CHECK (sal>100));


6.查詢USER_CONSTRAINTS視圖,確認約束已被添加,注意約束類型和名字

   SELECT table_name,constraint_name,constraint_type,status
   FROM   user_constraints
   WHERE  table_name='TEST_F';

7.禁用test_f表的check約束

   ALTER TABLE test_f
     DISABLE CONSTRAINT test_fsal_c CASCADE;

8.啓用test_f表的check約束

   ALTER TABLE test_f
     ENABLE CONSTRAINT test_fsal_c CASCADE;

9.刪除test_f表的check約束

   ALTER TABLE test_f
      DROP CONSTRAINT test_fsal_c CASCADE;


  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章