SQL是Structured Quevy Language(結構化查詢語言)的縮寫。SQL是專為資料庫而建立的操作指令集,是一種功能齊全的資料庫語言。在使用它時,隻需要發出“做什麼”的指令,“怎麼做”是不用使用者考慮的。SQL功能強大、簡單易學、使用友善,已經成為了資料庫操作的基礎,并且現在幾乎所有的資料庫均支援SQL。 ##1 二、SQL資料庫資料體系結構 SQL資料庫的資料體系結構基本上是三級結構,但使用術語與傳統關系模型術語不同。在SQL中,關系模式(模式)稱為“基本表”(base table);存儲模式(内模式)稱為“存儲檔案”(stored file);子模式(外模式)稱為“視圖”(view);元組稱為“行”(row);屬性稱為“列”(column)。名稱對稱如^00100009a^: ##1 三、SQL語言的組成 在正式學習SQL語言之前,首先讓我們對SQL語言有一個基本認識,介紹一下SQL語言的組成: 1.一個SQL資料庫是表(Table)的集合,它由一個或多個SQL模式定義。 2.一個SQL表由行集構成,一行是列的序列(集合),每列與行對應一個資料項。 3.一個表或者是一個基本表或者是一個視圖。基本表是實際存儲在資料庫的表,而視圖是由若幹基本表或其他視圖構成的表的定義。 4.一個基本表可以跨一個或多個存儲檔案,一個存儲檔案也可存放一個或多個基本表。每個存儲檔案與外部存儲上一個實體檔案對應。 5.使用者可以用SQL語句對視圖和基本表進行查詢等操作。在使用者角度來看,視圖和基本表是一樣的,沒有差別,都是關系(表格)。 6.SQL使用者可以是應用程式,也可以是終端使用者。SQL語句可嵌入在宿主語言的程式中使用,宿主語言有FORTRAN,COBOL,PASCAL,PL/I,C和Ada語言等。SQL使用者也能作為獨立的使用者接口,供互動環境下的終端使用者使用。 ##1 四、對資料庫進行操作 SQL包括了所有對資料庫的操作,主要是由4個部分組成: 1.資料定義:這一部分又稱為“SQL DDL”,定義資料庫的邏輯結構,包括定義資料庫、基本表、視圖和索引4部分。 2.資料操縱:這一部分又稱為“SQL DML”,其中包括資料查詢和資料更新兩大類操作,其中資料更新又包括插入、删除和更新三種操作。 3.資料控制:對使用者通路資料的控制有基本表和視圖的授權、完整性規則的描述,事務控制語句等。 4.嵌入式SQL語言的使用規定:規定SQL語句在宿主語言的程式中使用的規則。 下面我們将分别介紹: ##2 (一)資料定義 SQL資料定義功能包括定義資料庫、基本表、索引和視圖。 首先,讓我們了解一下SQL所提供的基本資料類型:(如^00100009b^) 1.資料庫的建立與删除 (1)建立資料庫:資料庫是一個包括了多個基本表的資料集,其語句格式為: CREATE DATABASE <資料庫名> [其它參數] 其中,<資料庫名>在系統中必須是唯一的,不能重複,不然将導緻資料存取失誤。[其它參數]因具體資料庫實作系統不同而異。 例:要建立項目管理資料庫(xmmanage),其語句應為: CREATE DATABASE xmmanage (2) 資料庫的删除:将資料庫及其全部内容從系統中删除。 其語句格式為:DROP DATABASE <資料庫名> 例:删除項目管理資料庫(xmmanage),其語句應為: DROP DATABASE xmmanage 2.基本表的定義及變更 本身獨立存在的表稱為基本表,在SQL語言中一個關系唯一對應一個基本表。基本表的定義指建立基本關系模式,而變更則是指對資料庫中已存在的基本表進行删除與修改。 (1)基本表的定義:基本表是非導出關系,其定義涉及表名、列名及資料類型等,其語句格式為: CREATE TABLE[<資料庫名>.]<表名> (<列名> 資料類型 [預設值] [NOT NULL / NULL] [,<列名> 資料類型 [預設值] [NOT NULL / NULL]]...... [,UNIQUE (列名[,列名]......)] [,PRIMARY KEY(列名)] [,FOREIGN KEY(列名[,列名]......)REFERENCE <表名>(列名[,列名]......)] [,CHECK(條件)] [其它參數]) 其中,〈資料庫名〉.]指出将建立立的表存放于該資料庫中; 建立的表由兩部分組成:其一為表和一組列名,其二是實際存放的資料(即可在定義表的同時,直接存放資料到表中); 列名為使用者自定義的易于了解的名稱,列名中不能使用空格; 資料類型為上面所介紹的幾種标準資料類型; [NOT NULL/NULL]指出該列是否允許存放空值,SQL語言支援空值的概念,所謂空值是“不知道”或“無意義”的值,值得注意的是資料“0”和空格都不是空值,系統一般預設允許為空值,是以當不允許為空值時,必須明确使用NOT NULL; [,UNIQUE]将列按照其規定的順序進行排列,如不指定排列順序,則按列的定義順序排列; [PRIMARY KEY]用于指定表的主鍵(即關系中的主屬性),實體完整性限制條件規定:主鍵必須是唯一的,非空的; [,FOREIGN KEY (列名[,列名]......) REFERENCE<表名>(列名[,列名]......)]是用于指定外鍵參照完整性限制條 件,FOREIGN KEY指定相關列為外鍵,其參照對象為另外一個表的指定列,即使用REFERENCE引入的外表中的列,當不指定外表列名時,系統将預設其列名與參照鍵的列名相同,要注意的是:使用外鍵時必須使用參照,另外資料的外鍵參照完整性限制條件規定:外鍵的值要麼與相對應的主鍵相同,要麼為空值(具體由實作系統不同而異) [,CHECK]用于使用指定條件對存入表中的資料進行檢查,以确定其合法性,提高資料的安全性。 例:要建立一個學生情況表(student) CREATE TABLE student //建立基本表student (st_class CHAR(8),// 定義列st_class班級,資料類型為8位定長字元串 st_no CHAR(10) NOT NULL,//定義列st_no學号,類型為10位定長字元串,非空 st_name CHAR(8) NOT NULL,//定義列st_name姓名,類型為8位定長字元串,非空 st_sex CHAR(2),//定義列st_sex性别,類型為2位定長字元串 st_age SMALLINT,//定義列st_age年齡,類型為短整型 PRIMARY KEY (st_no))//定義st_no學号為主鍵。 例:要建立課程設定表(subject) CREATE TABLE subject//建立基本表subject (su_no CHAR(4) NOT NULL,// 定義列su_no課号,類型為4位定長字元串,非空 su_subject CHAR(20) NOT NULL,// 定義列su_subject課程名,類型為20位定長字元串,非空 su_credit INTEGER,// 定義列su_credit學分,類型為長整數 su_period INTEGER,//定義列su_period學時,類型為長整數 su_preno CHAR(4),//定義列su_preno先修課号,類型為4位定長字元串 PRIMARY KEY(su_no))//定義su_no課号為主鍵。 例:要建立學生選課表(score) CREATE TABLE score //建立基本表score (st_no CHAR(10),//定義列st_no學号,類型為10位定長字元串 su_no CHAR(4),//定義列su_no課号,類型為4位定長字元串 sc_score INTEGER NULL,//定義列sc_score,類型為長整形,可以為空值 FOREIGN KEY (st_no) REFERENCE student,//從表student中引入參照外鍵st_no,以確定本表與表student的關聯與同步 FOREIGN KEY (suno) REFERENCE subject)//從表subject中引入參照外鍵su_no,以確定本表與表subject的關聯與同步 (2)基本表的删除:用以從資料庫中删除一個基本表及其全部内容,其語句格式為: DROP TABLE[<資料庫名>.]表名 例如:将上面建立的表都删除 DROP TABLE student,subject,score (3)基本表的修改:在基本表建立并使用一段時間後,可能需要根據實際要求對基本表的結構進行修改,即增加新的屬性或删除屬性。 增加屬性的語句格式為: ALTER TABLE [<資料庫名>.]表名 ADD (<列名> 資料類型 [預設值] [NOT NULL / NULL] [,<列名> 資料類型[預設值][NOT NULL / NULL]]...... [,UNIQUE (列名[,列名]......)] [,PRIMARY KEY(列名)] [,FOREIGN KEY(列名[,列名]......) REFERENCE <表名>(列名[,列名]......)] [,CHECK(條件)][其它參數]) 例如:在基本表student中加入列stborn出生日期,資料類型為DATE,且不能為空值 ALTER TABLE student ADD (stborn DATE NOT NULL) 删除屬性的語句格式為: ALTER TABLE [<資料庫名>.]表名 DROP ( <列名> 資料類型 [預設值][NOT NULL / NULL] [,<列名> 資料類型 [預設值][NOT NULL / NULL]]......) 例如:将基本表student中的列st_age删除 ALTER TABLE student DROP (st_age) 3.視圖定義與删除 在SQL中,視圖是外模式一級資料結構的基本機關。它是從一個或幾個基本表中導出的表,是從現有基本表中抽取若幹子集組成使用者的“專用表”。這種構造方式必須使用SQL中的SELECT語句來實作。在定義一個視圖時,隻是把其定義存放在系統的資料中,而并不直接存儲視圖對應的資料,直到使用者使用視圖時才去求得對應的資料。 (1)視圖的定義:定義視圖可以使用CREATE VIEW語句實作,其語句格式為: CREATE VIEW 視圖名 AS SELECT語句 從一個基本表中導出視圖: 例:從基本表student中導出隻包括女學生情況的視圖 CREATE VIEW WOMANVIEW AS //建立一個視圖WOMANVIEW SELECT st_class,st_no,st_name,st_age //選擇列st_class,st_no,st_name,st_age顯示 FROM student //從基本表student引入 WHERE st_sex=‘女’//引入條件為性别為“女”,注意字元變量都使用單引号引用 從多個基本表中導出視圖: 例如:從基本表student和score中導出隻包括女學生且分數在60分以上的視圖 CREATEVIEW WOMAN_SCORE AS //定義視圖WOMANSCORE SELECT student.st_class,student.st_no,student.st_name,student.st_age,score.sc_score //有選擇性顯示相關列 FROM student.score //從基本表student和score中引入 WHERE student.st_sex=‘女’AND score.sc_score>=60 AND student.st_no=score.st_no //選擇條件:性别為“女” 且分數在60分以上。并使用st_no将兩表聯系起來。 以後如果進行這一視圖的應用,則隻需使用語句 SELECT * FROM WOMAN_SCORE //其中“*”為通配符,代表所有元素 (2)視圖的删除:用于删除已不再使用的視圖,其語句格式如下: DROP VIEW 視圖名 例:将上面建立的WOMAN_SCORE視圖删除 DROP VIEW WOMAN_SCORE 4.索引的定義與删除 索引屬于實體存儲概念,而不是邏輯的概念。在SQL中抛棄了索引概念,直接使用主鍵概念。值得一提的是,有些關系DBMS同時包括索引機制和主鍵機制,這裡我們推薦使用主鍵機制,因為它對系統資源占用較低且效率較高。 (1)索引的定義:索引是建立在基本表之上的,其語句格式為: CREATE [UNIQUE] INDEX 索引名 ON [<資料庫名>.]表名(列名 [ASC/DESC][,列名 [ASC/DESC]]......) 這裡,保留字UNIQUE表示基本表中的索引值不允許重複,若預設則表示索引值在表中允許重複;DESC表示按索引鍵降序排列,若預設或ASC表示升序排列。 例:對基本表student中的st_no和st_age建立索引,分别為升序與降序,且索引值不允許重複 CREATE UNIQUE INDEX STINDEX ON//建立索引STINDEX student(st_no ASC,st_age DESC)//對student中的st_no和st_age建立索引 (2)索引的删除: DROP INDEX 索引名 例:删除上面建立的索引STINDEX DROP INDEX STINDEX ##2 (二)資料查詢 SQL是一種查詢功能很強的語言,隻要是資料庫存在的資料,總能通過适當的方法将它從資料庫中查找出來。SQL中的查詢語句隻有一個:SELECT,它可與其它語句配合完成所有的查詢功能。SELECT語句的完整文法,可以有6個子句。完整的文法如下: SELECT 目标表的列名或清單達式集合 FROM 基本表或(和)視圖集合 [WHERE條件表達式] [GROUP BY列名集合 [HAVING組條件表達式]] [ORDER BY列名[集合]…] 整個語句的語義如下:從FROM子句中列出的表中,選擇滿足WHERE子句中給出的條件表達式的元組,然後按GROUPBY子句(分組子句)中指定列的值分組,再提取滿足HAVING子句中組條件表達式的那些組,按SELECT子句給出的列名或清單達式求值輸出。ORDER子句(排序子句)是對輸出的目标表進行重新排序,并可附加說明ASC(升序)或DESC(降序)排列。 在WHERE子句中的條件表達式F中可出現下列操作符和運算函數: 算術比較運算符:<,<=,>,>=,=,<>。 邏輯運算符:AND,OR,NOT。 集合運算符:UNION(并),INTERSECT(交),EXCEPT(差)。 集合成員資格運算符:IN,NOT IN 謂詞:EXISTS(存在量詞),ALL,SOME,UNIQUE。 聚合函數:AVG(平均值),MIN(最小值),MAX(最大值),SUM(和),COUNT(計數)。 F中運算對象還可以是另一個SELECT語句,即SELECT語句可以嵌套。 上面隻是列出了WHERE子句中可出現的幾種主要操作,由于WHERE子句中的條件表達式可以很複雜,是以SELECT句型能表達的語義遠比其數學原形要複雜得多。 下面,我們以上面所建立的三個基本表為例,示範一下SELECT的應用: 1.無條件查詢 例:找出所有學生的的選課情況 SELECT st_no,su_no FROM score 例:找出所有學生的情況 SELECT* FROM student “*”為通配符,表示查找FROM中所指出關系的所有屬性的值。 2.條件查詢 條件查詢即帶有WHERE子句的查詢,所要查詢的對象必須滿足WHERE子句給出的條件。 例:找出任何一門課成績在70以上的學生情況、課号及分數 SELECT UNIQUE student.st_class,student.st_no,student.st_name,student.st_sex,student.st_age,score.su_no,score.score FROM student,score WHERE score.score>=70 AND score.stno=student.st_no 這裡使用UNIQUE是不從查詢結果集中去掉重複行,如果使用DISTINCT則會去掉重複行。另外邏輯運算符的優先順序為NOT→AND→OR。 例:找出課程号為c02的,考試成績不及格的學生 SELECT st_no FROM score WHERE su_no=‘c02’AND score<60 3.排序查詢 排序查詢是指将查詢結果按指定屬性的升序(ASC)或降序(DESC)排列,由ORDER BY子句指明。 例:查找不及格的課程,并将結果按課程号從大到小排列 SELECT UNIQUE su_no FROM score WHERE score<60 ORDER BY su_no DESC 4.嵌套查詢 嵌套查詢是指WHERE子句中又包含SELECT子句,它用于較複雜的跨多個基本表查詢的情況。 例:查找課程編号為c03且課程成績在80分以上的學生的學号、姓名 SELECT st_no,st_name FROM student WHERE stno IN (SELECT st_no FROM score WHERE su_no=‘c03’ AND score>80 ) 這裡需要明确的是:當查詢涉及多個基本表時用嵌套查詢逐次求解層次分明,具有結構程式設計特點。在嵌套查詢中,IN是常用到的謂詞。若使用者能确切知道内層查詢傳回的是單值,那麼也可用算術比較運算符表示使用者的要求。 5.計算查詢 計算查詢是指通過系統提供的特定函數(聚合函數)在語句中的直接使用而獲得某些隻有經過計算才能得到的結果。常用的函數有: COUNT(*) 計算元組的個數 COUNT(列名) 對某一列中的值計算個數 SUM(列名) 求某一列值的總和(此列值是數值型) AVG(列名) 求某一列值的平均值(此列值是數值型) MAX(列名) 求某一列值中的最大值 MIN(列名) 求某一列值中的最小值 例:求男學生的總人數和平均年齡 SELECT COUNT(*),AVG(st_age) FROM student WHERE st_sex=‘男’ 例:統計選修了課程的學生的人數 SELECT COUNT(DISTINCT st_no) FROM score 注意:這裡一定要加入DISTINCT,因為有的學生可能選修了多門課程,但統計時隻能按1人統計,是以要使用DISTINCT進行過濾。 ##2 (三) 資料更新 資料更新包括資料插入、删除和修改操作。它們分别由INSERT語句,DELETE語句及UPDATE語句完成。這些操作都可在任何基本表上進行,但在視圖上有所限制。其中,當視圖是由單個基本表導出時,可進行插入和修改操作,但不能進行删除操作;當視圖是從多個基本表中導出時,上述三種操作都不能進行。 1.資料插入 将資料插入SQL的基本表有兩種方式:一種是單元組的插入,另一種是多元組的插入。 單元組的插入:向基本表score中插入一個成績元組(100002,c02,95),可使用以下語句: INSERT INTO score(st_no,su_no,score) VALUES(‘100002’,‘c02’,95) 由此,可以給出單元組的插入語句格式: INSERT INTO表名(列名1[,列名2]…) VALUES(列值1[,列值2]…) 其中,列名序列為要插入值的列名集合,列值序列為要插入的對應值。若插入的是一個表的全部列值,則列名可以省略不寫如上面的(st_no,su_no,score)可以省去;若插入的是表的部分列值,則必須列出相應列名,此時,該關系中未列出的列名取空值。 多元組的插入:這是一種把SELECT語句查詢結果插入到某個已知的基本表中的方法。 例如:需要在表score中求出每個學生的平均成績,并保留在某個表中。此時可以先建立一個新的基本表stu_avggrade,再用INSERT語句把表score中求得的每一個學生的平均成績(用SELECT求得)插入至stu_avggrade中。 CREATE TABLE stu_avggrade (st_no CHAR(10) NOT NULL,//定義列st_no學号,類型為10位定長字元串,非空 age_grade SMALLINT NOT NULL )// 定義列age_grade平均分,類型為短整形,非空 INSERT INTO stu_avggrade(st_no,age_grade) SELECT st_no,AVG(score) FROM score GROUP BY st_no //因為要求每一個學生所有課程的平均成績,必須按學号分組進行計算。 2.資料删除 SQL的删除操作是指從基本表中删除滿足WHERE<條件表達式>的記錄。如果沒有WHERE子句,則删除表中全部記錄,但表結構依然存在。其語句格式為: DELETE FROM表名[WHERE 條件表達式] 下面舉例說明: 單元組的删除:把學号為100002的學生從表student中删除,可用以下語句: DELETE FROM student WHERE st_no=‘100002’//因為學号為100002的學生在表student中隻有一個,是以為單元組的删除 多元組的删除:學号為100002的成績從表score中删除,可用以下語句: DELETE FROM score WHERE st_no=‘100002’//由于學号為100002的元組在表score中可能有多個,是以為多元組删除 帶有子查詢的删除操作:删除所有不及格的學生記錄,可用以下語句 DELETE FROM student WHERE st_no IN (SELETE st_no FROM score WHERE score<60) 3.資料修改 修改語句是按SET子句中的表達式,在指定表中修改滿足條件表達式的記錄的相應列值。其語句格式如下: UPDATE 表名 SET 列名=列改變值[WHERE 條件表達式] 例:把c02的課程名改為英語,可以用下列語句: UPDATE subject SET su_subject=‘英語’ WHERE su_no=‘c02’ 例:将課程成績達到70分的學生成績,再提高10% UPDATE score SET score=1.1*score WHERE score>=70 SQL的删除語句和修改語句中的WHERE子句用法與SELECT中WHERE子句用法相同。資料的删除和修改操作,實際上要先做SELECT查詢操作,然後再把找到的元組删除或修改。 ##2 (四) 資料控制 由于資料庫管理系統是一個多使用者系統,為了控制使用者對資料的存取權利,保持資料的共享及完全性,SQL語言提供了一系列的資料控制功能。其中,主要包括安全性控制、完整性控制、事務控制和并發控制。 1.安全性控制 資料的安全性是指保護資料庫,以防非法使用造成資料洩露和破壞。保證資料安全性的主要方法是通過對資料庫存取權力的控制來防止非法使用資料庫中的資料。即限定不同使用者操作不同的資料對象的權限。 存取權控制包括權力的授與、檢查和撤消。權力授與和撤消指令由資料庫管理者或特定應用人員使用。系統在對資料庫操作前,先核實相應使用者是否有權在相應資料上進行所要求的操作。 (1)權力授與:權力授與有資料庫管理者專用的授權和使用者可用的授權兩種形式。資料庫管理者專用授權指令格式如下: |CONNECT | GRANT|RESOURCE|TO 使用者名[IDENTIFED BY 密碼] |DBA | 其中,CONNECT表示資料庫管理者允許指定的使用者具有連接配接到資料庫的權力,這種授權是針對新使用者;RESOURCE表示允許使用者建立自己的新關系模式,使用者獲得CONNECT權力後,必須獲得RESOURCE權力才能建立自己的新表;DBA表示資料庫管理者将自己的特權授與指定的使用者。若要同時授與某使用者上述三種授權中的多種權力,則必須通過三個相應的GRANT指令指定。 另外,具有CONNECT和RESOURCE授權的使用者可以建立自己的表,并在自己建立的表和視圖上具有查詢、插入、修改和删除的權力。但通常不能使用其他使用者的關系,除非能獲得其他使用者轉授給他的相應權力。 例:若允許使用者SSE連接配接到資料庫并可以建立他自己的關系,則可通過如下指令授與權力: GRANT CONNECT TO SSE INENTIFIED BY BD1928 GRANT RESOURCE TO SSE 使用者可用的授權是指使用者将自己擁有的部分或全部權力轉授給其他使用者的指令形式,其指令格式如下: |SELECT | |INSERT | |DELETE | GRANT|UPDATE(列名1[,列名2]…)|ON|表名 |TO|使用者名|[WITH GRANT OPTION] |ALTER | |視圖名| |PUBLIC| |NDEX | |ALL | 若對某一使用者同時授與多種操作權力,則操作指令符号可用“,”相隔。 PUBLIC 表示将權力授與資料庫的所有使用者,使用時要注意: 任選項WITH GRANT OPTION表示接到授權的使用者,具有将其所得到的同時權力再轉授給其他使用者權力。 例:如果将表student的查詢權授與所有使用者,可使用以下指令: GRANT SELECT ON student TO PUBLIC 例:若将表subject的插入及修改權力授與使用者SSE并使得他具有将這種權力轉授他人的權力,則可使用以下指令: GRANT INSERT,UPDATE(su_subject) ON subject TO SSE WITH GRANT OPTION 這裡,UPDATE後面跟su_subject是指出其所能修改的列。 (2)權力回收:權力回收是指回收指定使用者原已授與的某些權力。與權力授與指令相比對,權力回收也有資料庫管理者專用和使用者可用的兩種形式。 DBA專用的權力回收指令格式為: |CONNECT | REVOKE|RESOURCE|FROM使用者名 |DBA | 使用者可用的權力回收指令格式為: |SELECT | |INSERT | |DELETE | REVOKE|UPDATE(列名1[,列名2]…) |ON|表名 |FROM |使用者名| |ALTER | |視圖名| |PUBLIC| |INDEX | |ALL | 例:回收使用者SSE的DBA權力: REVOKE DBA FROM SSE 2.完整性控制 資料庫的完整性是指資料的正确性和相容性,這是資料庫理論中的重要概念。完整性控制的主要目的是防止語義上不正确的資料進入資料庫。關系系統中的完整性限制條件包括實體完整性、參照完整性和使用者定義完整性。而完整性限制條件的定義主要是通過CREATE TABLE語句中的[CHECK]子句來完成。另外,還有一些輔助指令可以進行資料完整性保護。如UNIQUE和NOT NULL,前者用于防止重複值進入資料庫,後者用于防止空值。 3.事務控制 事務是并發控制的基本機關,也是恢複的基本機關。在SQL中支援事務的概念。所謂事務,是使用者定義的一個操作序列(集合),這些操作要麼都做,要麼一個都不做,是一個不可分割的整體。一個事務通常以BEGIN TRANSACTION開始,以COMMIT或ROLLBACK結束。 SQL提供了事務送出和事務撤消兩種指令: (1)事務送出:事務送出的指令為: COMMIT [WORK] 事務送出标志着對資料庫的某種應用操作成功地完成,所有對資料庫的操作都必須作為事務送出給系統時才有效。事務一經送出就不能撤消。 (2)事務撤消:事務撤消的指令是: ROLLBACK [WORK] 事務撤消标志着相應事務對資料庫操作失敗,因而要撤消對資料庫的改變,即要“復原”到相應事務開始時的狀态。 當系統非正常結束時(如掉電、系統當機),将自動執行ROLLBACK指令 SQL還提供了自動送出事務的機制,其指令為: SET AUTO COMMIT ON 其對應的人工工作方式指令為: SET AUTO COMMIT OFF 一旦規定了自動送出事務方式,則系統将每條SQL指令視為一個事務,并在指令成功執行完成時自動地完成事務送出。 4.并發控制 資料庫作為共享資源,允許多個使用者程式并行地存取資料。當多個使用者并行地操作資料庫時,需要通過并發控制對它們加以協調、控制,以保證并發操作的正确執行,并保證資料庫的一緻性。 在SQL中,并發控制采用封鎖技術實作,當一個事務欲對某個資料對象操作時,可申請對該對象加鎖,取得對資料對象的一定控制,以限制其他事務對該對象的操作。其語句格式為: |SHARE | LOCK TABLE 表名(或表名集合)IN |EXCLUSVE |MODE [NOWAIT] |SHARE UPDATE| 其中,表名(或表名集合)中指出封鎖對象,若為多個表名,則各個表名間以“,”相隔;任選項NOWAIT表示多個使用者要求封鎖相同的關系時,後來提出的要求會被立即退回去,否則會等待該資源釋放。 SHARE表示共享封鎖方式;EXCLUSIVE表示獨占封鎖方式;SHARE UPDAE表示共享更新封鎖方式。其中共享封鎖方式允許其他事務讀同一資料,但防止其他事務對已封鎖的表進行更新,該鎖主要防止在表的兩次查詢之間對該表的改動;共享更新封鎖SHARE UPDATE是一個行封鎖機制,它可改善表級封鎖的并行性,它能允許并發事務讀和修改一個表中的不同的行;獨占封鎖方式EXCLUSIVE禁止其他事務獲得一個共享鎖且禁止其他事務執行任何資料操作語句,即一旦某個運作事務對某個資料對象施加了排它鎖,則其他任何事務都不能再對該資料對象施加任何方式的鎖,隻有處于等待狀态。如果不想無限等待,則選擇NOWAIT。 PHP(Hypertext Preprocessor,超文本預處理器)是一個遞歸的縮寫名稱,它是一種内嵌在HTML頁面内的腳本語言。它的功能強大,使用友善,開發難度不大,而且可以免費使用。 |