天天看點

oracle的主鍵限制添加删除

oracle的主鍵限制添加删除

1、建立表的同時建立主鍵限制

一、無命名

create table accounts (

accounts_number number primary key,

accounts_balance number

);

二、有命名 

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限制是沒有問題了。

表修改

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

                                             initrans 2

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限制

                             ADD CONSTRAINT uk_students_license

                             UNIQUE (state, license_no)

4、建立Check限制

                               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