Oracle筆記(二)

數據的更新操做

一、數據增長html

若是如今要想實現數據的增長操做,則可使用以下的語法完成:sql

INSERT INTO 表名稱 [(字段1,字段2,…)] VALUES(值1,值2,…);

若是要想進行增長數據的話,則如下的幾種數據類型要分別處理:數據庫

  • 增長數字:直接編寫數字,例如:123;
  • 增長字符串:字符串應該使用「’「聲明;
  • 增長DATE數據:
    • 第一種:能夠按照已有的字符串的格式編寫字符串,例如「’17-12月-80’」;
    • 第二種:利用TO_DATE()函數將字符串變爲DATE型數據;
    • 第三種:若是設置的時間爲當前系統時間,則使用SYSDATE;

但是對於數據的增長也有兩種操做格式:完整型、簡便型;緩存

範例:增長數據 —— 完整語法編寫服務器

INSERT INTO myemp(empno,ename,hiredate,sal,mgr,job,comm)
VALUES(8888,'張三',TO_DATE('1960-08-17','yyyy-mm-dd'),8000,7369,'清潔工',1000);
INSERT INTO myemp(empno,ename,hiredate,sal,mgr,job,deptno)
VALUES(8889,'李四',SYSDATE,3000,7369,'清潔工',30);

範例:增長數據 —— 簡便語法,不寫增長的列名稱session

INSERT INTO myemp VALUES(8889,'李四','清潔工',7369,SYSDATE,3000,null,30);

很明顯雖然簡便語法代碼少了,但是這種操做並不可取,因此在實際的開發之中,沒有任何一我的會寫簡便語法,這樣根本就不利於程序的維護,都編寫完整的操做。併發

二、數據修改函數

若是要想修改表中已有的數據,則能夠按照以下的語法進行:性能

UPDATE 表名稱 SET 更新字段1=更新值1,更新字段2=更新值2,… [WHERE 更新條件(s)];

範例:更新僱員編號是7369的基本工資爲5000,獎金爲2000,職位修改成MANAGER,僱傭日期修改成今天學習

UPDATE myemp SET sal=5000,comm=2000,job='MANAGER',hiredate=SYSDATE WHERE empno=7369;

範例:全部人的工資改成7500

UPDATE myemp SET sal=7500;

若是更新時候不加上更新操做,則意味着更新所有的數據,可是這種作法絕對不可取,若是如今表中的數據量較大的話,這種更新所耗費的時間是至關長的,並且性能也會明顯下降。

三、數據刪除

當數據再也不須要以後,就可使用如下的語法刪除數據:

DELETE FROM 表名稱 [WHERE 刪除條件(s)];

與更新同樣,若是沒有寫刪除條件的話,則表示刪除所有數據;

範例:刪除全部在1987年僱傭的僱員

DELETE FROM myemp WHERE TO_CHAR(hiredate,'yyyy')=1987;

必定要記住,若是刪除的時候沒有匹配條件的數據存在,則更新的記錄爲「0」,包括更新操做也是同樣的。

範例:刪除表中的所有記錄

DELETE FROM myemp;

通常對於刪除的操做而言,儘量少去使用,包括之後在進行系統開發的時候,對於全部的刪除操做以前實際上都建議你們先給出一個確認的提示框,以防止用戶誤刪除。

Delete和Truncate

¨ 都是刪除表中的數據

¨ Delete操做能夠rollback,能夠閃回

¨ Delete操做可能產生碎片,而且不釋放空間

¨ Truncate是清空表

2、事務處理

事務基礎

數據庫事務由如下的部分組成:

l 一個或多個DML 語句

l 一個 DDL(Data Definition Language – 數據定義語言) 語句

l 一個 DCL(Data Control Language – 數據控制語言) 語句

數據庫事務:

l 以第一個 DML 語句的執行做爲開始

l 如下面的其中之一做爲結束:

• 顯示結束:  commit rollback

• 隱式結束(自動提交):  DDL語言,DCL語言, exit(事務正常退出)

• 隱式回滾(系統異常終了):  關閉窗口,死機,掉電

使用COMMIT 和 ROLLBACK語句,咱們能夠:

l 確保數據完整性。

l 數據改變被提交以前預覽。

l 將邏輯上相關的操做分組。

全部的事務處理操做都是針對於每個session進行的,在Oracle數據庫之中,把每個鏈接到數據庫上的用戶都稱爲一個session,每個session之間彼此獨立,不會有任何的通信,而每個session獨享本身的事務控制,而事務控制之中主要使用兩個命令:

  • 事務的回滾:ROLLBACK,更新操做回到原點;
  • 事務的提交:COMMIT,真正的發出更新的操做,一旦提交以後沒法回滾;

wps_clip_image-4253

l 回滾到保留點

¨ 使用 SAVEPOINT 語句在當前事務中建立保存點。

¨ 使用 ROLLBACK TO SAVEPOINT 語句回滾到建立的保存點。

wps_clip_image-11130

1.1.1. 事務進程

¨ 自動提交在如下狀況中執行:

DDL 語句。

DCL 語句。

不使用 COMMIT 或 ROLLBACK 語句提交或回滾,正常結束會話exit。

¨ 會話異常結束或系統異常會致使自動回滾。

  • 提交或回滾前的數據狀態
    • 改變前的數據狀態是能夠恢復的
    • 執行 DML 操做的用戶能夠經過 SELECT 語句查詢以前的修正
    • 其餘用戶不能看到當前用戶所作的改變,直到當前用戶結束事務。
    • DML語句所涉及到的行被鎖定, 其餘用戶不能操做。
  • 提交後的數據狀態
    • 數據的改變已經被保存到數據庫中。
    • 改變前的數據已經丟失。
    • 全部用戶能夠看到結果。
    • 鎖被釋放, 其餘用戶能夠操做涉及到的數據。
    • 全部保存點被釋放。

l 提交數據示例:

wps_clip_image-4492

l 數據回滾後的狀態

使用 ROLLBACK 語句可以使數據變化失效:

l 數據改變被取消。

l 修改前的數據狀態被恢復。

l 鎖被釋放。

wps_clip_image-9331

1.1.2. 數據庫的事務隔離級別

¨ 對於同時運行的多個事務, 當這些事務訪問數據庫中相同的數據時, 若是沒有采起必要的隔離機制, 就會致使各類併發問題:

  • 髒讀: 對於兩個事物 T1, T2, T1 讀取了已經被 T2 更新但尚未被提交的字段. 以後, 若 T2 回滾, T1讀取的內容就是臨時且無效的.

  • 不可重複讀: 對於兩個事物 T1, T2, T1 讀取了一個字段, 而後 T2 更新了該字段. 以後, T1再次讀取同一個字段, 值就不一樣了.

  • 幻讀: 對於兩個事物 T1, T2, T1 從一個表中讀取了一個字段, 而後 T2 在該表中插入了一些新的行. 以後, 若是 T1 再次讀取同一個表, 就會多出幾行.

¨ 數據庫事務的隔離性: 數據庫系統必須具備隔離併發運行各個事務的能力, 使它們不會相互影響, 避免各類併發問題.

¨ 一個事務與其餘事務隔離的程度稱爲隔離級別. 數據庫規定了多種事務隔離級別, 不一樣隔離級別對應不一樣的干擾程度, 隔離級別越高, 數據一致性就越好, 但併發性越弱

l 數據庫提供的 4 種事務隔離級別:

wps_clip_image-14889

l Oracle 支持的 2 種事務隔離級別:READ COMMITED, SERIALIZABLE. Oracle 默認的事務隔離級別爲: READ COMMITED

l Mysql 支持 4 中事務隔離級別. Mysql 默認的事務隔離級別爲: REPEATABLE READ

3、數據僞列

範例:查詢前5條記錄

SELECT ROWNUM,empno,ename,job,hiredate,sal FROM emp
WHERE ROWNUM<=5;

範例:查詢6-10條記錄

按照正常的思惟確定是直接進行BETWEEN…AND的判斷;

SELECT ROWNUM,empno,ename,job,hiredate,sal FROM emp
WHERE ROWNUM BETWEEN 6 AND 10;

這個時候並無返回任何的數據,由於ROWNUM不是真實列,而要想真正的實現這種查詢,思路是:先查詢前10條記錄,以後再顯示後5條記錄,要依靠子查詢完成。

SELECT * FROM(
      SELECT ROWNUM m,empno,ename,job,hiredate,sal FROM emp
      WHERE ROWNUM<=10) temp
WHERE temp.m>5;

若是如今按照這個思路,下面就能夠給出往後程序中所須要分頁的功能實現。

範例:顯示前5條記錄

當前所在頁(currentPage)爲1;

每頁顯示的記錄長度(lineSize)爲5;

第一頁:

SELECT * FROM(
      SELECT ROWNUM m,empno,ename,job,hiredate,sal FROM emp
      WHERE ROWNUM<=5) temp
WHERE temp.m>0;

範例:顯示中間的5條記錄

當前所在頁(currentPage)爲2;

每頁顯示的記錄長度(lineSize)爲5;

第二頁:

SELECT * FROM(
      SELECT ROWNUM m,empno,ename,job,hiredate,sal FROM emp
      WHERE ROWNUM<=10) temp
WHERE temp.m>5;

範例:顯示第三頁的內容,currentPage=3,lineSize=10;

SELECT * FROM(
      SELECT ROWNUM m,empno,ename,job,hiredate,sal FROM emp
      WHERE ROWNUM<=15) temp
WHERE temp.m>10;

以上的程序就是分頁顯示操做的核心代碼。

 

表的建立及管理

1、經常使用的數據字段

數據類型

關鍵字

描述

1

字符串

VARCHAR2(n)

其中n表示的是字符串所能保存的最大長度,基本上保存200個左右的內容

2

整數

NUMBER(n)

表示最多爲n位的整數,有時候也可使用INT代替

3

小數

NUMBER(n,m)

其中m爲小數位,n-m爲整數位,有時候也可使用FLOAT代替

4

日期

DATE

存放日期-時間

5

大文本

CLOB

能夠存儲海量文字(4G),例如存儲《三國演藝》、《紅樓夢》

6

大對象

BLOB

存放二進制數據,例如:電影、MP三、圖片、文字

通常在開發之中使用最多的:VARCHAR2()、NUMBER、DATE、CLOB,而對於BLOB字段通常使用較少,首先BLOB能夠存放4G的二進制數據,可是存放進去以後,一是數據庫過於龐大,二是讀取不方便;

2、表的建立

若是如今要想進行表的建立,可使用以下的操做語法:

CREATE TABLE 表名稱 (
    字段1 數據類型 [DEFAULT默認值],
    字段2 數據類型 [DEFAULT默認值],
    … …,
    字段n 數據類型 [DEFAULT默認值]
);
建表規則

表名和列名:

l 必須以字母開頭

l 必須在 1–30 個字符之間

l 必須只能包含 A–Z, a–z, 0–9, _, $, 和 #

l 必須不能和用戶定義的其餘對象重名

l 必須不能是Oracle 的保留字

l Oracle默認存儲是都存爲大寫

l 數據庫名只能是1~8位,datalink能夠是128位,和其餘一些特殊字符

下面建立一張成員表(member),有以下保存的信息:姓名、年齡、生日、我的簡介。

CREATE TABLE member (
     name VARCHAR2(50) DEFAULT '無名氏',
     age NUMBER(3),
     birthday DATE DEFAULT SYSDATE,
     content CLOB
);

3、表的複製

在以前學習過表的複製操做,下面給出其完整的操做語法:

CREATE TABLE 複製表名稱 AS 子查詢;
4、爲表重命名
RENAME 舊的表名稱 TO 新的表名稱;

l 執行RENAME語句改變表, 視圖, 序列, 或同義詞的名稱

wps_clip_image-15966

l 必須是對象的擁有者

5、修改表結構
ALTER TABLE 表名稱 ADD(列名稱 數據類型 [DEFAULT 默認值],
  列名稱 數據類型 [DEFAULT 默認值],…);

若是增長的數據列沒有默認值,則全部已有的數據的列的內容都是null,而若是增長的列指定了DEFAULT默認值的話,則全部已有的數據列都是設置的默認值。

如今也能夠修改已有的表結構,此時的語法以下:

ALTER TABLE 表名稱 MODIFY(列名稱 數據類型 [DEFAULT 默認值],
  列名稱 數據類型 [DEFAULT 默認值],…);

6、清空表(Truncate)

l TRUNCATE TABLE 語句:

• 刪除表中全部的數據

• 釋放表的存儲空間

wps_clip_image-15747

l TRUNCATE語句不能回滾

l 可使用 DELETE 語句刪除數據

7、刪除表(Drop Table)

l 數據和結構都被刪除

l 全部正在運行的相關事物被提交

l 全部相關索引被刪除

l DROP TABLE 語句不能回滾,可是能夠閃回

wps_clip_image-16547

約束

1、非空約束(NOT NULL):NK

當數據表中的某個字段上的內容不但願設置爲null的話,則可使用NOT NULL進行指定。

範例:定義一張數據表

DROP TABLE member PURGE;
CREATE TABLE member(
    mid NUMBER,
    name VARCHAR2(50) NOT NULL
);
2、惟一約束(UNIQUE):UK

惟一約束指的是每一列上的數據是不容許重複的,例如:email地址每一個用戶確定是不重複的,那麼就使用惟一約束完成。

DROP TABLE member PURGE;
CREATE TABLE member(
    mid NUMBER,
    name VARCHAR2(50) NOT NULL,
    email VARCHAR2(50) UNIQUE
);
 

約束的名字建議的格式「約束類型_字段」,例如:「UK_email」,指定約束名稱使用CONSTRAINT完成。

DROP TABLE member PURGE;
CREATE TABLE member(
    mid NUMBER,
    name VARCHAR2(50) NOT NULL,
    email VARCHAR2(50),
    CONSTRAINT UK_email UNIQUE(email)
);
3、主鍵約束(Primary Key):PK

主鍵約束 = 非空約束 + 惟一約束,在以前設置惟一的約束的時候發現能夠設置爲null,而若是如今使用了主鍵約束以後則不能爲空,並且主鍵通常做爲數據的惟一的一個標記出現,例如:人員的ID。

爲了約束的使用方便,下面爲主鍵約束起一個名字。

DROP TABLE member PURGE;
CREATE TABLE member(
    mid NUMBER,
    name VARCHAR2(50) NOT NULL,
    CONSTRAINT pk_mid PRIMARY KEY(mid)
);

4、檢查約束(Check):CK

檢查約束指的是爲表中的數據增長一些過濾條件,例如:

  • 設置年齡的時候範圍是:0~200;
  • 設置性別的時候應該是:男、女;

範例:設置檢查約束

DROP TABLE member PURGE;
CREATE TABLE member(
    mid NUMBER,
    name VARCHAR2(50) NOT NULL,
    sex VARCHAR2(10) NOT NULL,
    age NUMBER(3),
    CONSTRAINT pk_mid PRIMARY KEY(mid),
    CONSTRAINT ck_sex CHECK(sex IN('男','女')),
    CONSTRAINT ck_age CHECK(age BETWEEN 0 AND 200)
);

5、主-外鍵約束

以前的四種約束都是在單張表中進行的,而主-外鍵約束是在兩張表中進行的,這兩張表是存在父子關係的,即:子表中某個字段的取值範圍由父表所決定。

例如,如今要求表示出一種關係,每個人有多本書,應該定義兩張數據表:member(主)、book(子);

DROP TABLE member PURGE;
DROP TABLE book PURGE;
CREATE TABLE member(
    mid NUMBER,
    name VARCHAR2(50) NOT NULL,
    CONSTRAINT pk_mid PRIMARY KEY(mid)
);
CREATE TABLE book(
    bid NUMBER,
    title VARCHAR2(50) NOT NULL,
    mid NUMBER,
    CONSTRAINT pk_bid PRIMARY KEY(bid),
    CONSTRAINT fk_mid FOREIGN KEY(mid) REFERENCES member(mid)
);

一、  刪除數據的時候,若是主表中的數據有對應的子表數據,則沒法刪除;

範例:刪除member表中mid爲1的數據

DELETE FROM member WHERE mid=1;

錯誤提示信息:「ORA-02292: 違反完整約束條件 (SCOTT.FK_MID) - 已找到子記錄」。

此時,只能先刪除子表記錄,以後再刪除父表記錄:

DELETE FROM book WHERE mid=1;
DELETE FROM member WHERE mid=1;

可是這種操做明顯不方便,若是說如今但願主表數據刪除以後,子表中對應的數據也能夠刪除的話,則能夠在創建外鍵約束的時候指定一個級聯刪除的功能,修改數據庫建立腳本:

DROP TABLE member PURGE;
DROP TABLE book PURGE;
CREATE TABLE member(
    mid NUMBER,
    name VARCHAR2(50) NOT NULL,
    CONSTRAINT pk_mid PRIMARY KEY(mid)
);
CREATE TABLE book(
    bid NUMBER,
    title VARCHAR2(50) NOT NULL,
    mid NUMBER,
    CONSTRAINT pk_bid PRIMARY KEY(bid),
    CONSTRAINT fk_mid FOREIGN KEY(mid) REFERENCES member(mid) 
ON DELETE CASCADE
);

此時因爲存在級聯刪除的操做,因此主表中的數據刪除以後,對應的子表中的數據也都會被同時刪除。

二、  刪除數據的時候,讓子表中對應的數據設置爲null

當主表中的數據刪除以後,對應的子表中的數據相關項也但願將其設置爲null,而不是刪除,此時,能夠繼續修改數據表的建立腳本:

 

DROP TABLE member PURGE;
DROP TABLE book PURGE;
CREATE TABLE member(
    mid NUMBER,
    name VARCHAR2(50) NOT NULL,
    CONSTRAINT pk_mid PRIMARY KEY(mid)
);
CREATE TABLE book(
    bid NUMBER,
    title VARCHAR2(50) NOT NULL,
    mid NUMBER,
    CONSTRAINT pk_bid PRIMARY KEY(bid),
    CONSTRAINT fk_mid FOREIGN KEY(mid) REFERENCES member(mid) 
ON DELETE SET NULL
);
INSERT INTO member(mid,name) VALUES(1,'張三');
INSERT INTO member(mid,name) VALUES(2,'李四');
INSERT INTO book(bid,title,mid) VALUES(101,'Java開發',1);
INSERT INTO book(bid,title,mid) VALUES(102,'Java Web開發',2);
INSERT INTO book(bid,title,mid) VALUES(103,'EJB開發',2);
INSERT INTO book(bid,title,mid) VALUES(105,'Android開發',1);
INSERT INTO book(bid,title,mid) VALUES(107,'AJAX開發',1);

三、  刪除父表以前必須首先先刪除對應的子表,不然沒法刪除

DROP TABLE book PURGE;
DROP TABLE member PURGE;

可是這樣作明顯很麻煩,由於對於一個未知的數據庫,若是要按照此類方式進行,則必須首先知道其父子關係,因此在Oracle之中專門提供了一個強制性刪除表的操做,即:再也不關心約束,在刪除的時候寫上一句「CASCADE CONSTRAINT」。

DROP TABLE member CASCADE CONSTRAINT PURGE;
DROP TABLE book CASCADE CONSTRAINT PURGE;

此時,不關心子表是否存在,直接強制性的刪除父表。

合理作法:在之後進行數據表刪除的時候,最好是先刪除子表,以後再刪除父表。

6、修改約束

約束自己也屬於數據庫對象,那麼也確定能夠進行修改操做,並且只要是修改都使用ALTER指令,約束的修改主要指的是如下兩種操做:

  • 爲表增長約束:
ALTER TABLE 表名稱 ADD CONSTRAINT 約束名稱 約束類型(字段);
  • 刪除表中的約束:
ALTER TABLE 表名稱 DROP CONSTRAINT 約束名稱;

能夠發現,若是要維護約束,確定須要一個正確的名字才能夠,但是在這五種約束之中,非空約束做爲一個特殊的約束沒法操做,如今有以下一張數據表:

DROP TABLE member CASCADE CONSTRAINT PURGE;
CREATE TABLE member(
    mid NUMBER,
    name VARCHAR2(50) NOT NULL,
    age NUMBER(3)
);

範例:爲表中增長主鍵約束

ALTER TABLE member ADD CONSTRAINT pk_mid PRIMARY KEY(mid);

增長數據:

INSERT INTO member(mid,name,age) VALUES(1,'張三',30);
INSERT INTO member(mid,name,age) VALUES(2,'李四',300);

如今在member表中已經存在了年齡上的非法數據,因此下面爲member表增長檢查約束:

ALTER TABLE member ADD CONSTRAINT ck_age CHECK(age BETWEEN 0 AND 250);

這個時候在表中已經存在了違反約束的數據,因此確定沒法增長。

範例:刪除member表中的mid上的主鍵約束

ALTER TABLE member DROP CONSTRAINT pk_mid;

但是,跟表結構同樣,約束最好也不要修改,並且記住,表創建的同時必定要將約束定義好,之後的使用之中建議就不要去改變了。

7、查詢約束

在Oracle之中全部的對象都會在數據字典之中保存,而約束也是同樣的,因此若是要想知道有哪些約束,能夠直接查詢「user_constraints」數據字典:

SELECT owner,constraint_name,table_name FROM 
user_constraints
;

可是這個查詢出來的約束只是告訴了你名字,而並無告訴在哪一個字段上有此約束,因此此時能夠查看另一張數據字典表「user_cons_columns」;

COL owner FOR A15;
COL constraint_name FOR A15;
COL table_name FOR A15;
COL column_name FOR A15;
SELECT owner,constraint_name,table_name,column_name FROM 
user_cons_columns
;

集合

在數學的操做之中存在交、差、並、補的概念,而在數據的查詢中也存在此概念,有以下幾個鏈接符號:

  • UNION:鏈接兩個查詢,相同的部分不顯示;
  • UNION ALL:鏈接兩個查詢,相同的部分顯示;
  • INTERSECT:返回兩個查詢中的相同部分;
  • MINUS:返回兩個查詢中的不一樣部分;

wps_clip_image-19518

視圖,序列,索引,同義詞

1、視圖

l 視圖是一種虛表. 

l 視圖創建在已有表的基礎上, 視圖賴以創建的這些表稱爲基表。

l 向視圖提供數據內容的語句爲 SELECT 語句, 能夠將視圖理解爲存儲起來的 SELECT 語句. 

l 視圖向用戶提供基表數據的另外一種表現形式

l 視圖的優勢

¨ 簡化複雜查詢

¨ 限制數據訪問

¨ 一樣的數據,能夠有不一樣的顯示方式

l 注意:不建議經過視圖對錶進行修改

視圖不能提升性能

l 使用下面的語法格式建立視圖

wps_clip_image-19848

• FORCE:           子查詢不必定存在

• NOFORCE:      子查詢存在(默認)

• WITH READ ONLY:只能作查詢操做

l 子查詢能夠是複雜的 SELECT 語句

視圖中使用DML的規定

l 能夠在簡單視圖中執行 DML 操做

l 當視圖定義中包含如下元素之一時不能使用delete:

  • l 組函數
  • l GROUP BY 子句
  • l DISTINCT 關鍵字
  • l ROWNUM 僞列

當視圖定義中包含如下元素之一時不能使用update :

  • l 組函數
  • l GROUP BY子句
  • l DISTINCT 關鍵字
  • l ROWNUM 僞列
  • l 列的定義爲表達式

當視圖定義中包含如下元素之一時不能使用insert :

  • l 組函數
  • l GROUP BY 子句
  • l DISTINCT 關鍵字
  • l ROWNUM 僞列
  • l 列的定義爲表達式
  • l 表中非空的列在視圖定義中未包括
  • 選項一:WITH CHECK OPTION

上面所建立的視圖,是存在一個建立條件的「WHERE deptno=20」,那麼若是如今更新視圖中的這個條件呢?

UPDATE myview SET deptno=30 WHERE empno=7369;

此時更新的是一張視圖,可是視圖自己並非一個具體的數據表,並且如今更新的操做又是視圖的建立條件,很明顯這樣的作法不可取,因此此時爲了解決這個問題,能夠加入WITH CHECK OPTION;

CREATE OR REPLACE VIEW myview AS
  SELECT * FROM emp WHERE deptno=20
  WITH CHECK OPTION;

此時再次執行視圖的更新操做,出現如下錯誤提示:

ORA-01402: 視圖 WITH CHECK OPTIDN where 子句違規

意味着如今根本就不能去更新視圖的建立條件。

  • 選項二:WITH READ ONLY

雖然使用WITH CHECK OPTION能夠保證視圖的建立條件不被更新,可是其餘的字段卻容許更新。

UPDATE myview SET sal=9000 WHERE empno=7369;

與以前的問題同樣,視圖自己不是具體的真實數據,而是一些查詢語句,因此這樣的更新並不合理,那麼在建立視圖的時候建議將其設置爲只讀視圖:

CREATE OR REPLACE VIEW myview AS
  SELECT * FROM emp WHERE deptno=20
  WITH READ ONLY;

此時再次發出更新的操做,則直接提示以下錯誤:

ORA-01733: 此處不容許虛擬列

並且必定要注意的是,以上給出的是一個簡單的操做語句視圖,若是如今視圖中的查詢語句是統計操做,則根本就不可能更新。

CREATE OR REPLACE VIEW myview AS
  SELECT d.deptno,d.dname,d.loc,COUNT(e.empno) count,AVG(e.sal) avg
  FROM emp e,dept d
  WHERE e.deptno(+)=d.deptno
  GROUP BY d.deptno,d.dname,d.loc;

 

2、序列

序列: 可供多個用戶用來產生惟一數值的數據庫對象

l 自動提供惟一的數值

l 共享對象

l 主要用於提供主鍵值

l 將序列值裝入內存能夠提升訪問效率

建立序列

CREATE SEQUENCE myseq;

當一個序列建立完成以後 ,能夠經過如下兩種方式訪問序列:

  • 序列名稱.nextval:讓序列增加到下一個內容;
  • 序列名稱.currval:取得當前序列的內容;

在Oracle之中若是要想操做currval,則首先必須使用nextval;

序列通常都做爲主鍵使用,例如,下面定義一張表:

DROP TABLE mytab PURGE;
CREATE TABLE mytab (
    id NUMBER PRIMARY KEY,
    name VARCHAR2(20) NOT NULL
);

如今向mytab表中增長數據:

INSERT INTO mytab(id,name) VALUES(myseq.nextval,'姓名');

在默認狀況下,序列從0開始,每次增加1,那麼如今也能夠修改;

範例:建立序列,從10開始,每次增加2

DROP SEQUENCE myseq;
CREATE SEQUENCE myseq INCREMENT BY 2 START WITH 10;

範例:但願定義一個序列,這個序列能夠在一、三、五、七、9之間循環出現;

DROP SEQUENCE myseq;
CREATE SEQUENCE myseq INCREMENT BY 2 START WITH 1 MAXVALUE 10 MINVALUE 1 CYCLE NOCACHE;

關於序列中的CACHE解釋:

      在Oracle數據庫之中,因爲序列被常用到,因此Oracle爲了攬性能,將序列的操做形式作了以下的處理。

      準備了一塊空間,這個空間之中,爲用戶準備好了若干個已經生成好的序列,每次操做的時候都是從這塊空間之中取出序列的內容,可是這樣有一個問題,若是如今數據庫的實例關閉了,那麼保存在這塊空間中的內容就有可能消失了,可是雖然消失了,但是數據庫已經增加好了,這樣就會出現跳號的事情,而若是要想取消掉這種問題,則最好的方式是將序列設置爲不緩存,使用NOCACHE聲明。

3、同義詞

同義詞就是意思相近的一組詞語,對於同義詞的操做以前一直在使用,例如,如今有以下一個查詢語句:

SELECT SYSDATE FROM dual;

在以前說過「dual」是一張虛擬表,可是虛擬表也確定應該有它的用戶,通過查詢能夠發現,這張表是屬於SYS用戶的,可是這個時候就出現一個問題,在以前講解過,不一樣的用戶要想訪問其餘用戶的表,則須要寫上「用戶.表名稱」,那麼爲何此時scott用戶訪問的時候直接使用dual便可,而不是使用「sys.dual」呢,這個實際上就是同義詞的應用,dual表示的是sys.dual的同義詞,而同義詞在Oracle之中稱爲SYNONYM,同義詞的建立語法以下:

CREATE [PUBLIC] SYSNONYM 同義詞的名稱 FOR 用戶名.表名稱;

 

4、索引

l 一種獨立於表的模式對象, 能夠存儲在與表不一樣的磁盤或表空間中

l 索引被刪除或損壞, 不會對錶產生影響, 其影響的只是查詢的速度

l 索引一旦創建, Oracle 管理系統會對其進行自動維護, 並且由 Oracle 管理系統決定什麼時候使用索引. 用戶不用在查詢語句中指定使用哪一個索引

l 在刪除一個表時, 全部基於該表的索引會自動被刪除

l 經過指針加速 Oracle 服務器的查詢速度

l 經過快速定位數據的方法,減小磁盤 I/O

在Oracle之中建立索引有如下兩種方式:

  • 主鍵約束:若是一張表中的列上存在了主鍵約束的話,自動建立索引;
  • 手工建立:在某一個操做列上指定一個索引;

可是這種索引有一個最大的問題,即:若是要想實現性能的提升,則必須始終維持以上的一棵樹,那麼若是說如今這棵樹上的數據須要頻繁修改的話,則代碼的性能確定會有所下降。

因此通常索引只使用在不會頻繁修改的表中,而若是一張表上頻繁修改數據且又使用了索引的話,性能確定會嚴重下降,因此性能的攬永遠都是相對的。

如下狀況能夠建立索引:

  • l 列中數據值分佈範圍很廣

  • l 列常常在 WHERE 子句或鏈接條件中出現

  • l 表常常被訪問並且數據量很大 ,訪問的數據大概佔數據總量的2%到4%

  • l 何時不要建立索引

下列狀況不要建立索引:
  • l 表很小

  • l 列不常常做爲鏈接條件或出如今WHERE子句中

  • l 查詢的數據大於2%到4%

  • l 表常常更新

用戶管理

建立用戶

範例:建立一個user用戶,密碼爲password

CONN sys/change_on_install AS SYSDBA;
CREATE USER user IDENTIFIED BY password;

注意:「ORA-00988:口令缺失或無效」 錯誤,這種狀況一般發生於建立 Oracle 例程時指定了非正常的全局數據庫名稱或系統用戶密碼。請注意全局數據庫名稱不能以數字開頭,口令密碼也不能由數字開頭

Oracle對密碼的要求以下:

  • 系統用戶(SYS、SYSTEM)口令長度不能小於7個字符;
  • 密碼由1 到 30 個字符 (characters)組成;
  • 必須以字母開頭,不能是符號或者數字;
  • 只接受字母,數字,以及三個符號 "#", "_" and "$";
  • 密碼不能包含像"SELECT","DELETE","CREATE"這類的 Oracle/SQL 關鍵字;

 

提示用戶如今沒有建立SESSION的權限,在以前曾經解釋過,對於sqlplusw而言,每個用戶都表示一個SESSION,若是沒有建立SESSION的權限就意味着不能登陸,因此下面要受權。

範例:將CREATE SESSION的權限給user用戶

GRANT CREATE SESSION TO user;

將建立表的權限給user用戶

GRANT CREATE TABLE TO user;

將CONNECT和RESOURCE TO user;

GRANT CONNECT,RESOURCE TO user;

可是如今一旦存在了用戶的操做,那麼就須要有用戶的管理操做,最簡單的一個功能,用戶有可能丟掉本身的密碼。

範例:修改密碼

ALTER USER user IDENTIFIED BY password2;

可是當管理員爲一個用戶重置一個密碼以後,每每會但願用戶在第一次登陸的時候能夠修改密碼,因此此時能夠經過以下的命令讓密碼失效:

ALTER USER user PASSWORD EXPIRE;

也能夠控制一個用戶的鎖定操做:

ALTER USER user ACCOUNT LOCK;

ALTER USER user ACCOUNT UNLOCK;

範例:回收user用戶的權限

REVOKE SELECT,INSERT ON scott.emp FROM user;
REVOKE CONNECT,RESOURCE,CREATE TABLE,CREATE SESSION FROM user;

數據庫備份

1、數據的導出和導入

數據的導出和導入是針對於一個用戶的備份操做,能夠按照以下的方式完成:

一、  數據的導出

  • 在硬盤上創建一個文件夾:c:\backup;
  • 輸入exp指令;
  • 輸入用戶名和密碼;
  • 設置導出文件的名稱:導出文件: EXPDAT.DMP;

二、  數據的導入

  • 先將表刪除乾淨;
  • 進入到導出文件所在的文件夾之中:c:\backup;
  • 輸入imp指令;
  • 輸入用戶名和密碼;
  • 導入整個導出文件 (yes/no): no > yes

可是以上的操做只是作爲一個演示,由於這種備份操做自己只適合數據量小的狀況,若是數據量較大的話,這種操做是會損耗性能的,並且時間也會很長,要想解決大數據量的問題只能對數據分區操做。

2、數據表的冷備份

在數據操做之中,有可能有些用戶不會進行事務的提交,那麼在這種狀況下極可能沒法進行完整的備份操做,而所謂的冷備份指的就是在閉數據庫實例的狀況下進行數據庫備份操做的實現。

若是要進行冷備份,則須要備份出數據庫中的一些幾個核心內容:

  • 控制文件,指的是控制整個Oracle數據庫的實例服務的核心文件,直接經過」v$controlfile」找到;
  • 重作日誌文件,能夠進行數據的災難恢復,直接經過」v$logfile」找到;
  • 數據文件,表空間文件,經過」v$datafile」和」v$tablespace」找到;
  • 核心操做的配置文件(pfile),經過」SHOW PARAMETER pfile」找到;

從實際的Oracle的部署來說,全部的文件爲了達到IO的平衡操做,要分別保存在不一樣的硬盤上。

肯定了要備份的文件以後,下面按照以下的步驟查找:

一、  使用超級管理員登陸

CONN sys/change_on_install AS SYSDBA;

二、  查找全部的控制文件目錄

SELECT * FROM v$controlfile;

三、  備份重作日誌文件

SELECT * FROM v$logfile;

四、  查找表空間文件

SELECT * FROM v$tablespace;
SELECT * FROM v$datafile;

五、  找到pfile文件

SHOW PARAMETER pfile;

六、  關閉數據庫實例

SHUTDOWN IMMEDIATE;

七、  將全部查找到的數據備份到磁盤上;

八、  啓動數據庫實例

STARTUP;

 
 
 

參考及推薦!:http://www.cnblogs.com/mchina/archive/2012/09/12/2678093.html

相關文章
相關標籤/搜索