Oracle主鍵約束的建立,新增和刪除
Oracle主鍵約束的建立,新增和刪除
2010-06-27 10:40:16| 分類: | 標籤:|字號大中小 訂閱
oracle的主鍵約束新增刪除
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約束是我們用到的最多的約束之一了。我們可以在建立表時讓系統自動指定notnull約束的名字來建立,也可以手動的的指定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.完整的例子:
Createtable test (xm char(20) not null,zy varchar(30) default (‘計算機’));
-- Create table
create table DEPT
(
DEPTNO NUMBER(2) not null,
DNAMEVARCHAR2(14),
LOC VARCHAR2(13)
)
tablespace USERS
pctfree10
initrans 1
maxtrans255
storage
(
initial64K
minextents 1
maxextents unlimited
);
-- Create/Recreateprimary, unique and foreign key constraints
alter tableDEPT
addconstraint PK_DEPT primary key (DEPTNO)
using index
tablespaceUSERS
pctfree 10
initrans 2
maxtrans 255
storage
(
initial64K
minextents 1
maxextents unlimited
);
c.規則
Alter table 命令有許多選項,一個記住語法的方法是Oracle執行這個操作需要的資訊:
1)、你不得不告訴Oracle你準備alter什麼表:
Alter tabletable_name
2)、然後,你準備做什麼?Adding 一個約束
ALTER TABLEtable_name ADD CONSTRAINT
3)、強烈建議但不要求為約束定義個名字。約束名不需要放在引號裡,但會以大寫字母形式儲存在資料字典裡,
ALTER TABLE tempADD CONSTRAINT pk_temp
4)、表示約束型別將是Primary Key,Unique,Foreign Key,或Check約束
ALTER TABLE tempADD CONSTRAINT pk_temp PRIMARY KEY
5)、跟在約束型別後面有幾種特殊選項,Primary Key和Unique約束,需要指定約束的列;Check約束需要指定約束規則。
ALTER TABLE tempADD CONSTRAINT pk_temp PRIMARY KEY (ID);
6)、Primary Key和Unique約束應當指定索引的表空間名,使用USING INDEXTABLESPACE子句.
ALTER TABLE tempADD CONSTRAINT pk_temp PRIMARY KEY (ID) USING INDEX TABLESPACE student_index;
建立表及索引:
create tableDEPT
(
DEPTNO NUMBER(2) notnull,
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
)
)
altertable DEPT
add constraint PK_DEPT primary key (DEPTNO)
using index
tablespace USERS
pctfree10
initrans 2
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
2.修改表.
Alter table table_name
Add column_name type [defaultexpression] 增加新列
Modify datatype default expression 修改已有列和屬性
Storagestorage_clause 修改儲存特徵
Dropdrop_clause 刪除約束條件
a.改變表所在的表空間
alter table name move tablespace newtablespace
例: ①在表xs中新增兩列.jsj,djsm
Alter table xs add(jxjnum<img src="<img src="<imgsrc="">">">ber(1),djsm varchar(40) default ‘獎金1000’);
②在表xs中修改名為djsm的列的預設值
Altertalbe xs modify(djsm default ‘獎金800’)
③在表中刪除名為jxj和djxm的列.
Alter table xs drop column jxj;
Alter table xs drop column djsm;
④修改表xs_kc的儲存特徵
Altertalbe xs pctfree 20 maxtrans 200
⑤為表xs_jsj加上主鍵
Altertable 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),statusvarchar2(15));
⑧.更改表名:
alter table t rename tos;
⑨.更改列名
alter table t renamecolumn n to s;
3.約束
Oracle資料庫的完整性約束規則
唯一性約束(Unique constraint)
唯一性約束可以保護表中多個數據列,保證在保護的資料列中任何兩行的資料都不相同。唯一性約束與表一起建立,在唯一性約束建立後,可以使用ALTER TABLE語句修改。
語法:
column_name data_typeCONSTRAINT constraint_name UNIQUE
如果唯一性約束保護多個數據列,那麼唯一性約束要作為表約束增加。語法如下:
CONSTRAINT constraint_name (column) UNIQUE
USING INDEXTABLESPACE (tablespace_name)
STORAGE(stored clause)
唯一性約束由一個B-tree索引增強,所以可以在USING子串中為索引使用特殊特徵,比如表空間或儲存引數。CREATE TABLE語句在建立唯一性約束的同時也給目標資料列建立了一個唯一的索引。Feedom.net國內最早的網管網站
CREATE TABLEinsured_autos (policy_id NUMBER CONSTRAINT pk_policies PRIMARY KEY, vinVARCHAR2(10), coverage_begin DATE, coverage_term NUMBER, CONSTRAIN unique_autoUNIQUE (policy_id,vin) bitsCN_com
USINGINDEX TABLESPACE index STORAGE (INITIAL 1M NEXT 10M PCTINCREASE 0) )使用者可以禁用未以性約束,但他仍然存在,禁用唯一性約束使用ALTERTABLE 語句
ALTER TABLE insured_autosDISABLE CONSTRAIN unique_name;
刪除唯一性約束,使用ALTERTABLE....DROP CONSTRAIN語句 ALTER TABLE insured_autos DROPCONSTRAIN unique_name; 注意使用者不能刪除在有外部鍵指向的表的唯一性約束。這種情況下使用者必須首 先禁用或刪除外部鍵(foreign key)。 bitscn.com中國網管聯盟
刪除或禁用唯一性約束通常同時刪除相關聯的唯一索引,因而降低了資料庫效能。經常刪除或禁用唯一性約束有可能導致丟失索引帶來的效能錯誤。要避免這樣錯誤,可以採取下面的步驟:
1、在唯一性約束保護的資料列上建立非唯一性索引。
2、新增唯一性約束
主鍵(Primary Key)約束 bitscn.com中國網管聯盟 表有唯一的主鍵約束。表的主鍵可以保護一個或多個列,主鍵約束可與NOTNULL約束共同作用於每一資料列。NOTNULL約束和唯一性約束的組合將保證主鍵唯一地標識每一行。像唯一性約束一樣,主鍵由B-tree索引增強。 09hr.com網管求職 建立主鍵約束使用CREATE TABLE語句與表一起建立,如果表已經建立了,可以使用ALTER
TABLE語句。
CREATETABLE 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中國網管聯盟
CREATETABLE 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 DROPPRIMARY KEY;
ALTERTABLE policies DISABLE PRIMARY KEY;
1、建立約束
CREATE TABLEstudents
(student_id VARCHAR2(10) NOTNULL,
student_nameVARCHAR2(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 TABLEstudents
ADDCONSTRAINT pk_students PRIMARY KEY (student_id)
USING INDEXTABLESPACE student_index;
3、建立Unique約束
ALTER TABLEstudents
ADDCONSTRAINT uk_students_license
UNIQUE(state, license_no)
USING INDEXTABLESPACE student_index;
4、建立Check約束
ALTER TABLEstudents
ADDCONSTRAINT ck_students_st_lic
CHECK((state IS NULL AND license_no IS NULL) OR
(state IS NOT NULL ANDlicense_no is NOT NULL));
新增check約束
alter table emp add constraint concheck(dept_salary>0);
con 為約束名, dept_salary為欄位名
5、建立外來鍵約束
ALTER TABLEstudents
ADDCONSTRAINT fk_students_state
FOREIGN KEY(state) REFERENCES state_lookup (state);
6. 約束..
Alter tabletable_name add constrants BID primary key (bookno);
ALERT TABLEtable_name MODIFY( column1 PRIMARY KEY);
1、建立表的同時建立主鍵約束
(1)無命名 create table student (studentid int primary key not null,
studentnamevarchar(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 tablestudent drop constraint SYS_C002715;
(3) 使約束失效:
alter tabletbl_employee disable constraint fk_emp;
刪除約束:
alter tabletbl_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 wheretable_name='TBL_EMPLOYEE';
3. 刪除表.
Drop table table_name;
4、操作表資料
插入表記錄:
①. a. insert into table_namecol1,col2 values (val1,val2);
例:Insrt intoxs(xh,xm,) values (‘09’,to_date(‘19860210’,’yyyymmdd’));
insert into deptovalues('100','xieyunchao','m','22',to_date('19861104','yyyy-mm-dd'),10000)
b.從一個表中向另一個表中插入資料
Insertinto table1(col1,col2,col3) select (col1,col2,col3)
from othertable
c.使用子查詢插入資料
insert into employee (empno,ename,sal,deptno)
selectempno,ename,sal,depto from emp;
d.INSERT INTO EMP(ENAME,HIREDATE) VALUE(‘AA’,TO_DATE(‘1980-12-09’,’YYYY-MM-DD’))
③. 刪除表資料:
Deletefrom table_name where condition;
④. 修改表記錄
Updatetable_name set column_name=expression,…where condition.
基於一張表修改另一張表的資料
UPDATE EMPLEE SETDEPTNO=(SELECT DENPNO FROM EMP WHERE EMPNO=7788)
WHEREJOB=(SELECT JOB FROM EMP WHERE EMPNO=7788)
⑤. 刪除所有記錄但保留表結構.
Truncatetable table_name;
⑥.查詢資料
查詢表結構:DESC table_name
Selectename,sal,12*sal+100 from emp
注:select count(dinstinct(deptno))from emp
a.查詢大於平均的:
select empno from emp a,(select avg(sal) assal_sal from emp) b
wherea.sal>b.sal_sal;
如果列中有空值時,則結果也為空(關於null值的處理(p47)).
如:selectename,name,12*sal+comm如果comm的值為null,結果也為null;
如上所示,comm為null時.則12*sal+comm也為null;解決方法是用nvl方法替換.
在兩個表中查詢:以下兩種方式都是一樣的.
a.selectt_phone_operation.operation_name
from t_phone_operation ,t_phone_operation_charge
wheret_phone_operation.operation_id=t_phone_operation_charge.operation_id and
t_phone_operation_charge.phone_num=’159..’;
b.select operation_name fromt_phone_operation where operation_id in (select operation_id fromt_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 ”annualsalary”
使用連線操作符:
Select ename || job as“employees” from emp
用連線字元:
Select ename ||’ ’||’is a ’||’ ’||job as “employee details”
限制重複的行:
Select distinct deptnofrom emp
注意大小寫:
Select ename,job,deptnofrom emp where job=’CLERK’
使用between ….and 運算子
Select ename,sal fromemp where sal between 1000 and 1500;
使用in 運算子
Selectempno,ename,sal,mgr from emp where mgr in(23,231,2345);
Like運算子:(模糊查詢)
%代表至多任意字元
_代表一個任意字元
如:select ename from emp where enamelike ’s%’;
顯示第三個字元為大寫A的所有資訊
SELECT ENAME ,SALFROM EMP WHERE ENAME LIKE '__A%';
顯示僱員名包含"_"的僱員資訊(其中ESCAPE後的字元a為轉義字元)
SELECT ENAME,SALWHERE ENAME LIKE '%a_% ESCAPE 'a';
Null運算子(關於null值的處理(p47):)
測試一個值是否為空:
Select ename,mgrfrom 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 "月收入" fromEMP;
使用NVL2函式處理NULL值
語法為NVL(exp1,exp2,exp3),如果exp1不是null,則返回exp2,如果exp1是null,則返回exp3;
用WHERE語句限制日期
示例一.符合預設日期格式
select * from emp wherehiredate>'01-1月-82'
示例2:不符合預設日期格式(需要用TO_DATE函式轉換)
SELECT * FROM EMPWHERE HIREDATE>TO_DATE('1994-9-24','yyyy-mm-dd');
邏輯操作符:And or not
Order by 子句
a. 使用order by 子句對查詢資料排序
―――asc:升序,預設
―――desc:降序:
依據多列進行排序:
Selectename,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 whereename=’scott’)
多行子查詢:
select ename ,job,sal,deptno from emp where job in
(select distinct job from emp wheredeptno=10)
使用比較符:
IN:匹配子查詢結果中的任何一個就可以(見上例).
ALL:必須要符合子查詢結果中的所有值.
ANY:只要符合子查詢結果中的任何一個就可以.
ALL的使用:
SELECT ENAME,SAL,DEPTNO FROM EMP WHERE SAL>ALL
(SELECT SAL FROM EMP WHEREDEPTNO=30)
ANY 的使用:
SELECT ENAME,SAL,DEPTNO FROM EMP WHERESAL>ANY
(SELECT SAL FROM EMP WHERE DEPT=’30’)
多列子查詢:
SELECT ENAME,JOB,SAL,DEPTNO FROM EMP WHERE (DEPTNO,JOB) =
(SELECTDEPTNO,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 fromtable_name where condition;
DELETE FROM EMP WHEREDEPTNO=(SELECT DEPTNO FROM DEPT WHERE DNAME=’SALES’)
⑧. 修改表記錄
Update table_name setcolumn_name=expression,…where condition.
UPDATE TABLE_NAME SETCOL1=A*1.1,COL2=B*2 WHERE
更新日期:
UPDATE TABLE_NAME SETHIREDATE =TO_DATE(‘1987/12/1’,’YYYY/MM/DD’);
更新關連資料
UPDATE EMP SET(ENAME,SAL,COMM)=(SELECT ENAME,SAL,COMM FROM EMP WHERE ENAME=’XX’)WHEREENAME=’YY’
複製其他表資料
UPDATE EMPLEYEE SETDEPTNO=(SELECT DEPT FROM EMP WHERE EMPNO=7788)WHERE JOB=(SELECT JOB FROM EMPWHERE EMPNO=7788)
⑨.刪除所有記錄但保留表結構.
Truncate tabletable_name;
⑩.事務
a. 當出現下面的事件時,事務便結束
①. commit or rollback 被執行時.
②. Ddl or dcl被執行時.create or drop 等
③. 使用者退出.
④. 系統中止或當機.
b. 事務儲存點.
update ....
savepoint update_done
insert ....
rollback TO update_done