oracle的主鍵約束添加刪除

From : http://blog.csdn.net/rodger004/archive/2008/06/06/2517469.aspx

1、創建表的同時創建主鍵約束
一、無命名
create table accounts (
accounts_number number primary key,
accounts_balance number
);
二、有命名 
create table accounts (
accounts_number number primary key,
accounts_balance number,
constraint yy primary key(accounts_number)
);

2、刪除表中已有的主鍵約束
一、無命名
SELECT * FROM USER_CONS_COLUMNS WHERE TALBE_NAME='accounts';
找出主鍵名
ALTER TABLE ACCOUNTS DROP CONSTRAINT SYS_C003063;
二、有命名
ALTER TABLE ACCOUNTS DROP CONTRAINT yy;

3、向表中添加主鍵約束
ALTER TABLE ACCOUNTS ADD CONSTRAINT PK_ACCOUNTS PRIMARY KEY(ACCOUNTS_NUMBER);

oracle中not null約束是我們用到的最多的約束之一了。我們可以在創建表時讓系統自動指定not null約束的名字來創建,也可以手動的的指定not null約束的名字來創建,也可以在表創建好後手動的修改表已達到增加not null約束的目的。

下面是一個例子
create table test_not_null
(id number not null,
name varchar2(30) ,
tel varchar2(20) constraint test_not_null_tel not null);

在這裏我們創建了一個表,並分別給id 和 tel兩列創建了not null的約束,其中id的約束是系統自動命名的,而tel的約束使我們手動命名的。對於地二個列name,oracle系統不會自動增加not null的約束。

我們可以在這個表裏面插入一行數據,例如:
insert into test_not_null(id,tel) values(123,’88888888′);

我們也還可以使用修改表的方式來增加not null約束。例如剛纔我們沒有在test_not_null上建立空值約束,我們可以現在通過修改的方式來建立
alter table test_not_null
modify(name not null);

如果你執行了剛纔我們的插入數據的操作,你執行這句話的時候可能會有以下錯誤:
ORA-02296: 無法啓用 (SYS.) - 找到空值

這是因爲我們剛纔在插入數據時已經給name這一列增加了一個空值,現在又要在這一列上增加not null約束,顯然是不行的。
如果實際問題中我們真的遇到這種需求,例如對於某個字段我們認爲原來可以爲空,並且再該列插入了很多空值,後來我們發現實際上是不應該爲空的,可能會需先將原來的空值全部更新到一個新的有統一意義的值,然後在進行空值約束的加入操作。例如我們可以這樣做:
update test_not_null
set name = ‘不知道’
where name is null;

現在我們再增加列的not null約束是沒有問題了。
alter table test_not_null
modify(name not null);

表修改

1.創建表:
       a. 創建xs表中計算機專業學生的備份
           Create table xs_jsj as select * from xs where zym=’計算機’;
       b.完整的例子:
      Create table test (xm char(20) not null,zy varchar(30) default (‘計算機’));
                -- Create table
                create table DEPT
                                (
                                    DEPTNO NUMBER(2) not null,
                                    DNAME VARCHAR2(14),
                                    LOC    VARCHAR2(13)
                                  )
                                tablespace USERS
                                pctfree 10
                                initrans 1
                                maxtrans 255
                        storage
                                (
                                 initial 64K
                                 minextents 1
                                 maxextents unlimited
                                 );
                -- Create/Recreate primary, unique and foreign key constraints
                            alter table DEPT
                             add constraint PK_DEPT primary key (DEPTNO)
                             using index
                             tablespace USERS
                             pctfree 10
                             initrans 2
                             maxtrans 255
                             storage
                             (
                                initial 64K
                                minextents 1
                                maxextents unlimited
                 );
         c.規則
             Alter table 命令有許多選項,一個記住語法的方法是Oracle執行這個操作需要的信息:
                1)、你不得不告訴Oracle你準備alter什麼表:
                         Alter table table_name
                2)、然後,你準備做什麼?Adding 一個約束
                         ALTER TABLE table_name ADD CONSTRAINT
                3)、強烈建議但不要求爲約束定義個名字。約束名不需要放在引號裏,但會以大寫字母形式存儲在數據字典裏,
                         ALTER TABLE temp ADD CONSTRAINT pk_temp
                4)、表示約束類型將是Primary Key,Unique,Foreign Key,或Check約束
                         ALTER TABLE temp ADD CONSTRAINT pk_temp PRIMARY KEY
                5)、跟在約束類型後面有幾種特殊選項,Primary Key和Unique約束,需要指定約束的列;Check約束需要指定約束規則。
                        ALTER TABLE temp ADD CONSTRAINT pk_temp PRIMARY KEY (ID);
                6)、Primary Key和Unique約束應當指定索引的表空間名,使用USING INDEX TABLESPACE子句.
                        ALTER TABLE temp ADD CONSTRAINT pk_temp PRIMARY KEY (ID) USING INDEX TABLESPACE student_index;
                        創建表及索引:
                            create table DEPT                               
                                            (
                                             DEPTNO NUMBER(2) not null,
                                             DNAME VARCHAR2(14),
                                             LOC    VARCHAR2(13)
                                            )
                                            tablespace USERS
                                             pctfree 10
                                             initrans 1
                                             maxtrans 255
                                             storage
                                             (
                                                initial 64K
                                                minextents 1
                                                maxextents unlimited
                                             );
                                             
                                            create table employees
                                            (empno number(5),
                                            deptno number(3) not null,
                                                                                constraint emp_pk primary           key(empno,deptno)   //有名的主鍵
                                            using index tablespace index
                                            storage (initial 64K
                                            next 64K
                                            )
                                            )
                                           
                                                                                 alter table DEPT               
add constraint PK_DEPT primary key (DEPTNO)
                                             using index
                                             tablespace USERS
                                             pctfree 10
                                             initrans 2
                                             maxtrans 255
                                             storage
                                             (
                                                initial 64K
                                                minextents 1
                                                maxextents unlimited
                                             );
2.修改表.
        Alter table table_name
        Add column_name type [default expression]    增加新列
          Modify datatype default expression           修改已有列和屬性
    Storage storage_clause                 修改存儲特徵
    Drop drop_clause                             刪除約束條件
       a.改變表所在的表空間
                                    alter   table   name   move   tablespace   newtablespace
        例: ①在表xs中添加兩列.jsj,djsm
                   Alter table xs add(jxj num<img src="<img src="<img src="">">">ber(1),djsm varchar(40) default ‘獎金1000’);
             ②在表xs中修改名爲djsm的列的默認值
         Alter talbe xs modify(djsm default ‘獎金800’)
             ③在表中刪除名爲jxj和djxm的列.
                         Alter table xs drop column jxj;
                 Alter table xs drop column djsm;
             ④修改表xs_kc的存儲特徵
         Alter talbe xs pctfree 20 maxtrans 200
             ⑤爲表xs_jsj加上主鍵
         Alter table xs_jsj add (constraint “pk_jsj” primary key(xh));
              ⑥ 增加列
                 語法:ALTER TABLE [schema.] table_name ADD column_definition type
                 例: ALTER TABLE orders ADD order_date DATE;
             ⑦更改列
           語法:ALTER TABLE [schema.] table_name MODIFY column_name new_attributes;
             例: ALTER TABLE orders MODITY (quantity number(10,3),status varchar2(15)); 
              ⑧.更改表名:
                 alter table t rename to s;
              ⑨.更改列名
                 alter table t rename column n to s;
 
 
3.約束
Oracle數據庫的完整性約束規則
            唯一性約束(Unique constraint)
            唯一性約束可以保護表中多個數據列,保證在保護的數據列中任何兩行的數據都不相同。唯一性約束與表一起創建,在唯一性約束創建後,可以使用ALTER TABLE語句修改。
            語法:
                column_name data_type CONSTRAINT constraint_name UNIQUE
                如果唯一性約束保護多個數據列,那麼唯一性約束要作爲表約束增加。語法如下:
                                 CONSTRAINT constraint_name (column) UNIQUE
                                 USING INDEX TABLESPACE (tablespace_name)
                                 STORAGE (stored clause)
    唯一性約束由一個B-tree索引增強,所以可以在USING子串中爲索引使用特殊特徵,比如表空間或存儲參數。CREATE TABLE語句在創建唯一性約束的同時也給目標數據列建立了一個唯一的索引。 Feedom.net國內最早的網管網站
                                CREATE TABLE insured_autos (policy_id NUMBER CONSTRAINT pk_policies PRIMARY KEY, vin VARCHAR2(10), coverage_begin DATE, coverage_term NUMBER, CONSTRAIN unique_auto UNIQUE (policy_id,vin) bitsCN_com
                                USING INDEX TABLESPACE index STORAGE (INITIAL 1M NEXT 10M PCTINCREASE 0) )用戶可以禁用未以性約束,但他仍然存在,禁用唯一性約束使用ALTER TABLE 語句
            ALTER TABLE insured_autos DISABLE CONSTRAIN unique_name;                   
刪除唯一性約束,使用ALTER TABLE....DROP CONSTRAIN語句                      ALTER TABLE insured_autos DROP CONSTRAIN unique_name;           注意用戶不能刪除在有外部鍵指向的表的唯一性約束。這種情況下用戶必須首            先禁用或刪除外部鍵(foreign key)。 bitscn.com中國網管聯盟
        刪除或禁用唯一性約束通常同時刪除相關聯的唯一索引,因而降低了數據庫性能。經常刪除或禁用唯一性約束有可能導致丟失索引帶來的性能錯誤。要避免這樣錯誤,可以採取下面的步驟:                                         
            1、在唯一性約束保護的數據列上創建非唯一性索引。
            2、添加唯一性約束
                    主鍵(Primary Key)約束 bitscn.com中國網管聯盟                                    表有唯一的主鍵約束。表的主鍵可以保護一個或多個列,主鍵約束可與NOT NULL約束共同作用於每一數據列。NOT NULL約束和唯一性約束的組合將保證主鍵唯一地標識每一行。像唯一性約束一樣,主鍵由B-tree索引增強。 09hr.com網管求職        創建主鍵約束使用CREATE TABLE語句與表一起創建,如果表已經創建了,可以使用ALTER TABLE語句。
                                CREATE TABLE policies (policy_id NUMBER CONSTRAINT pk_policies PRIMARY KEY, holder_name VARCHAR2(40), gender VARCHAR2(1), marital_status VARCHAR2(1), date_of_birth DATE );
                                  與唯一性約束一樣,如果主鍵約束保護多個數據列,那麼必須作爲一個表約束創建。 bitscn.com中國網管聯盟
                                CREATE TABLE insured_autos (policy_id NUMBER, vin VARCHAR2(40), coverage_begin DATE, coverage_term NUMBER, CONSTRAINT pk_insured_autos PRIMARY KEY (policy_id,vin) USING INDEX TABLESPACE index STORAGE (INITIAL 1M NEXT 10M PCTINCREASE 0) );             
                                  禁用或刪除主鍵必須與ALTER TABLE 語句一起使用
                                ALTER TABLE policies DROP PRIMARY KEY;
                                ALTER TABLE policies DISABLE PRIMARY KEY;
1、創建約束
                            CREATE TABLE students
                             (student_id    VARCHAR2(10) NOT NULL,
                             student_name VARCHAR2(30) NOT NULL,
                             college_major VARCHAR2(15) NOT NULL,
                             status        VARCHAR2(20) NOT NULL,
                             state         VARCHAR2(2),
                             license_no    VARCHAR2(30)) TABLESPACE student_data;
2、創建主鍵
                            ALTER TABLE students
                             ADD CONSTRAINT pk_students PRIMARY KEY (student_id)
                             USING INDEX TABLESPACE student_index;
3、創建Unique約束
                            ALTER TABLE students
                             ADD CONSTRAINT uk_students_license
                             UNIQUE (state, license_no)
                             USING INDEX TABLESPACE student_index;
4、創建Check約束
                            ALTER TABLE students
                               ADD CONSTRAINT ck_students_st_lic
                                    CHECK ((state IS NULL AND license_no IS NULL) OR
                                          (state IS NOT NULL AND license_no is NOT NULL));
                            添加check約束
           alter table emp add constraint con check(dept_salary>0);
            con 爲約束名, dept_salary爲字段名
                                
5、創建外鍵約束
                             ALTER TABLE students
                             ADD CONSTRAINT fk_students_state
                             FOREIGN KEY (state) REFERENCES state_lookup (state);
6. 約束..
                    Alter table table_name add constrants BID primary key (bookno);
                    ALERT TABLE table_name MODIFY( column1 PRIMARY KEY);
      1、創建表的同時創建主鍵約束
                        (1)無命名 create table student (studentid  int  primary key not null,
                                                          studentname varchar(8),age int);
                        (2)有命名 create table students (studentid int ,studentname varchar(8),
                                                    age int,constraint yy primary key(studentid));
     2、刪除表中已有的主鍵約束
                        (1)有命名 alter table students drop constraint yy;
                        (2)無命名 可用 SELECT * from user_cons_columns where ..;
                             查找表中主鍵名稱得student表中的主鍵名爲SYS_C002715
                             alter table student drop constraint SYS_C002715;
                      (3) 使約束失效:
                             alter table tbl_employee disable constraint fk_emp;
                     刪除約束:
                            alter table tbl_department drop constraint pk_dept;
                     查詢約束:
select CONSTRAINT_NAME from user_constraints where table_name='TBL_EMPLOYEE';
select CONSTRAINT_NAME,COLUMN_NAME from user_cons_columns where table_name='TBL_EMPLOYEE';
     3. 刪除表.
          Drop table table_name;
4、操作表數據
           插入表記錄:
            . a. insert into table_name col1,col2 values (val1,val2); 
例:Insrt into xs(xh,xm,) values (‘09’,to_date(‘19860210’,’yyyymmdd’));
                    insert into    depto values('100','xieyunchao','m','22',to_date('19861104','yyyy-mm-dd'),10000)
                 b.從一個表中向另一個表中插入數據
             Insert into table1(col1,col2,col3) select (col1,col2,col3)
                   from othertable
                 c.使用子查詢插入數據
                     insert into employee (empno,ename,sal,deptno)
                              select empno,ename,sal,depto from emp;
                d.INSERT INTO EMP (ENAME,HIREDATE) VALUE(‘AA’,TO_DATE(‘1980-12-09’,’YYYY-MM-DD’))
      ③. 刪除表數據:
         Delete from table_name where condition;
      ④. 修改表記錄
         Update table_name set column_name=expression,…where condition.
                基於一張表修改另一張表的數據
                  UPDATE EMPLEE SET DEPTNO=(SELECT DENPNO FROM EMP WHERE EMPNO=7788)
                                 WHERE JOB=(SELECT JOB FROM EMP WHERE EMPNO=7788)
      ⑤. 刪除所有記錄但保留表結構.
         Truncate table table_name;
      ⑥.查詢數據
               查詢表結構:DESC table_name
         Select ename,sal,12*sal+100 from emp
               :select count(dinstinct(deptno)) from emp
               a.查詢大於平均的
                  select empno from emp a,(select avg(sal) as sal_sal from emp) b
                         where a.sal>b.sal_sal;
       如果列中有空值時,則結果也爲空(關於null值的處理(p47).
         如:select ename,name,12*sal+comm如果comm的值爲null,結果也爲null;
                      如上所示,comm爲null時.則12*sal+comm也爲null;解決方法是用nvl方法替換.
              在兩個表中查詢:以下兩種方式都是一樣的.
                  a.select t_phone_operation.operation_name
                                                from t_phone_operation ,t_phone_operation_charge
                                                where t_phone_operation.operation_id=t_phone_operation_charge.operation_id and
                                                                                    t_phone_operation_charge.phone_num=’159..’;
                                   b.select operation_name from t_phone_operation where operation_id in (select operation_id from t_phone_operation_charge where phone_num='159...'
使用日期格式顯示日期:
select ename,to_char(hiredate,’yyyy—mm---dd’) from emp
select ename where hiredate>to_date(‘1999-12-31’,’yyyy-mm-dd’);
             
 
              使用別名的三種方式:
                  a.    select ename as name,sal salary,from emp
                  b.    select ename ” name”, sal*12 annual salary
              使用連接操作符:
                  Select ename || job as “employees” from emp
              用連接字符:
                  Select ename ||’ ’||’ is a ’||’ ’||job as “employee details”
              限制重複的行
                  Select distinct deptno from emp
              注意大小寫:
                  Select ename,job,deptno from emp where job=’CLERK’
              使用between ….and 運算符
                  Select ename,sal from emp where sal between 1000 and 1500;
              使用in 運算符
                  Select empno,ename,sal,mgr from emp where mgr in(23,231,2345);  
              Like運算符:(模糊查詢)
                  %代表至多任意字符
                 _代表一個任意字符
                        如:select ename from emp where ename like ’s%’;
                  顯示第三個字符爲大寫A的所有信息
                        SELECT ENAME ,SAL FROM EMP WHERE ENAME LIKE '__A%';
                  顯示僱員名包含"_"的僱員信息(其中ESCAPE後的字符a爲轉義字符)
                        SELECT ENAME,SAL WHERE ENAME LIKE '%a_% ESCAPE 'a';
             Null運算符(關於null值的處理(p47))
                測試一個值是否爲空:
                        Select ename,mgr from emp where mgr is null (注意是is null ,不是=null)
             使用NVL函數處理NULL值
                 NVL函數用於將NULL轉換爲實際值,其語法爲NVL(exp1,exp2).如果是exp1 是null,則返回
                 exp2,如果exp1不爲null,則返回exp1,參數exp1和exp2是任意相同的數據類型.
                 如:
                 SELECT ENAME, SAL,SAL+NVL(COM,0) AS "月收入" from EMP;
             使用NVL2函數處理NULL值
                語法爲NVL(exp1,exp2,exp3),如果exp1不是null,則返回exp2,如果exp1是null,則返回exp3;
             用WHERE語句限制日期
                示例一.符合默認日期格式
                  select * from emp where hiredate>'01-1月-82'
                示例2:不符合默認日期格式(需要用TO_DATE函數轉換)
                  SELECT * FROM EMP WHERE  HIREDATE>TO_DATE('1994-9-24','yyyy-mm-dd');
            邏輯操作符:And or not
            Order by 子句
                       a.   使用order by 子句對查詢數據排序
                             ―――asc:升序,默認
                             ―――desc:降序:
 
                       依據多列進行排序:
                             Select ename,deptno,sal from emp order by deptno,sal desc
                總結:
                SELECT    [DISTINCT] {*,COLUMN[ALIAS],…..}    //DISTINCT不重複
                FROM      tablename
                WHERE     condition
                ORDER BY   {column,expr,alias} [ASC|DESC]
            分組查詢:
           常用分組函數:
                MAX , MIN ,AVG ,SUM,COUNT,VARIANCE(取方差),STDDEV(取標準差)
     當使用分組函數時,分組函數只能出現在選擇列表,order by ,和having子句中,而不能出現在where 和group by子句中.
     當執行SELECT 語句時,如果選擇列表同時包含列,表達式,和分組函數,那麼這些列和表達式必須出現在GROUP BY子句中.  
select deptno,avg(sal),count(*) from emp group by deptno;
        having avg(sal)<2000;
●如果在select 語句中同時包含group by ,    having ,以及order by子句,則必須將order by子句放在最後.
●當限制分組結果時,必須要使用having ,而不能在WHERE 子句中使用分函數限制分組顯示結果.
子查詢:
    子查詢的作用:
     在insert 或create table 語句中使用子查詢,可以將表數據插入到目標表中.
     通過update 子句中使用子查詢,可以修改一列事多列數據.
     通過在where ,having,start with 子句中使用子查詢,可以提供條件值.
單行子查詢:
select ename ,sal,deptno from emp where deptno=(select deptno from emp where ename=’scott’)
多行子查詢
select ename ,job,sal,deptno from emp where job in
 (select distinct job from emp where deptno=10)
使用比較符:
IN:匹配子查詢結果中的任何一個就可以(見上例).
ALL:必須要符合子查詢結果中的所有值.
ANY:只要符合子查詢結果中的任何一個就可以.
ALL的使用:
SELECT ENAME,SAL,DEPTNO FROM EMP WHERE SAL>ALL
       (SELECT SAL FROM EMP WHERE DEPTNO=30)
ANY 的使用
   SELECT ENAME,SAL,DEPTNO FROM EMP WHERE SAL>ANY
(SELECT SAL FROM EMP WHERE DEPT=’30’)
                多列子查詢:
                    SELECT ENAME ,JOB,SAL,DEPTNO FROM EMP WHERE (DEPTNO,JOB) =
                        (SELECT DEPTNO,JOB FROM EMP WHERE ENAME =’SMITH’)
SELECT ENAME,SAL ,COMM,DEPTNO FROM EMP WHERE (SAL,NVL(COMM,-1)) IN (SELECT     SAL,NVL(COMM,-1)FROM EMP WHERE DEPTNO=30)
           
 
 
 
 
 
            ⑦.刪除表數據:
                    Delete from table_name where condition;
                    DELETE FROM EMP WHERE DEPTNO=(SELECT DEPTNO FROM DEPT WHERE DNAME=’SALES’)
            修改表記錄
                    Update table_name set column_name=expression,…where condition.
                    UPDATE TABLE_NAME SET COL1=A*1.1,COL2=B*2 WHERE
                    更新日期:
                    UPDATE TABLE_NAME SET HIREDATE =TO_DATE(‘1987/12/1’,’YYYY/MM/DD’);
                    更新關連數據
                    UPDATE EMP SET (ENAME,SAL,COMM)=(SELECT ENAME,SAL,COMM FROM EMP WHERE ENAME=’XX’)WHERE ENAME=’YY’
                    複製其他表數據
                    UPDATE EMPLEYEE SET DEPTNO=(SELECT DEPT FROM EMP WHERE EMPNO=7788)WHERE JOB=(SELECT JOB FROM EMP WHERE EMPNO=7788)
            ⑨.刪除所有記錄但保留表結構.
                    Truncate table table_name;
                   
            .事務
             a. 當出現下面的事件時,事務便結束
                  ①. commit or rollback 被執行時.
                  ②. Ddl or dcl被執行時.create or drop 等
                  ③. 用戶退出.
                  ④. 系統中止或當機.
             b. 事務保存點.
               update ....
                  savepoint update_done
                  insert ....
                  rollback TO update_done

 

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