第八章 SQL修改数据库
文章目錄
- 第八章 SQL修改數(shù)據(jù)庫
- 插入數(shù)據(jù)
- 使用SQL插入數(shù)據(jù)
- 使用對象屬性插入數(shù)據(jù)
- UPDATE語句
- 在插入或更新時計算字段值
- 刪除語句
- 事務(wù)處理
- 事務(wù)和保存點(diǎn)
- 非事務(wù)操作
- 事務(wù)鎖
- 事務(wù)大小限制
- 讀取未提交的數(shù)據(jù)
- ObjectScript事務(wù)命令
第八章 SQL修改數(shù)據(jù)庫
可以對現(xiàn)有的表使用SQL語句,也可以對相應(yīng)的持久化類使用ObjectScript操作來修改InterSystems IRIS?數(shù)據(jù)平臺數(shù)據(jù)庫的內(nèi)容。
不能修改定義為只讀的持久類(表)。
使用SQL命令為維護(hù)數(shù)據(jù)的完整性提供了自動支持。
SQL命令是一個原子操作(全部或沒有)。
如果表上定義了索引,SQL將自動更新它們以反映更改。
如果定義了任何數(shù)據(jù)或引用完整性約束,SQL將自動執(zhí)行它們。
如果有任何已定義的觸發(fā)器,執(zhí)行這些操作將拉動相應(yīng)的觸發(fā)器。
插入數(shù)據(jù)
可以使用SQL語句或設(shè)置和保存持久化類屬性將數(shù)據(jù)插入表中。
使用SQL插入數(shù)據(jù)
INSERT語句將一條新記錄插入SQL表中。
可以插入一條記錄或多條記錄。
下面的示例插入一條記錄。
它是插入單個記錄的幾種可用語法形式之一:
以下示例通過查詢現(xiàn)有表中的數(shù)據(jù)插入多條記錄:
INSERT INTO MyApp.Person(Name,HairColor) SELECT Name,Haircolor FROM Sample.Person WHERE Haircolor IS NOT NULL還可以發(fā)出INSERT或UPDATE語句。
如果SQL表中不存在新記錄,則該語句將該記錄插入該SQL表中。
如果記錄存在,則該語句使用提供的字段值更新記錄數(shù)據(jù)。
使用對象屬性插入數(shù)據(jù)
可以使用ObjectScript插入一條或多條數(shù)據(jù)記錄。
創(chuàng)建一個現(xiàn)有持久化類的實(shí)例,設(shè)置一個或多個屬性值,然后使用%Save()插入數(shù)據(jù)記錄:
下面的例子插入一條記錄:
SET oref=##class(MyApp.Person).%New()SET oref.Name="Fred Rogers"SET oref.HairColor="Black"DO oref.%Save()下面的例子插入多條記錄:
SET nom=$LISTBUILD("Fred Rogers","Fred Astare","Fred Flintstone")SET hair=$LISTBUILD("Black","Light Brown","Dark Brown")FOR i=1:1:$LISTLENGTH(nom) {SET oref=##class(MyApp.Person).%New()SET oref.Name=$LIST(nom,i)SET oref.HairColor=$LIST(hair,i)SET status = oref.%Save() }UPDATE語句
UPDATE語句修改SQL表中的一條或多條現(xiàn)有記錄中的值:
UPDATE語句修改SQL表中的一條或多條現(xiàn)有記錄中的值:在插入或更新時計算字段值
在定義計算字段時,可以指定ObjectScript代碼來計算該字段的數(shù)據(jù)值。
可以在插入、更新行、插入和更新行或查詢行時計算此數(shù)據(jù)值。
下表顯示了每種計算操作類型所需的關(guān)鍵字以及字段/屬性定義示例:
- 只在插入時計算
- SQL DDL COMPUTECODE關(guān)鍵字Birthday VARCHAR(50) COMPUTECODE {SET {Birthday}=$PIECE($ZDATE({DOB},9),",")_" changed: "_$ZTIMESTAMP}
- 持久化類定義SqlComputeCode和SqlComputeCode關(guān)鍵字屬性生日為%String(MAXLEN = 50) [SqlComputeCode = {SET {Birthday}=$PIECE($ZDATE({DOB},9),",") _" changed: "_$ZTIMESTAMP}, SqlComputed];
- 只在更新時計算
- SQL DDL DEFAULT, COMPUTECODE,和COMPUTEONCHANGE關(guān)鍵字Birthday VARCHAR(50) DEFAULT ' ' COMPUTECODE {SET {Birthday}=$PIECE($ZDATE({DOB},9),",")_" changed: "_$ZTIMESTAMP} COMPUTEONCHANGE (DOB)
- 在插入和更新上都進(jìn)行計算
- SQL DDL COMPUTECODE和COMPUTEONCHANGE關(guān)鍵字Birthday VARCHAR(50) COMPUTECODE {SET {Birthday}=$PIECE($ZDATE({DOB},9),",")_" changed: "_$ZTIMESTAMP} COMPUTEONCHANGE (DOB)
- 持久化類定義SqlComputeCode, SqlComputed, and SqlComputeOnChange屬性關(guān)鍵字屬性Birthday As %String(MAXLEN = 50) [SqlComputeCode = {SET {Birthday}=$PIECE($ZDATE({DOB},9),",") _" changed: "_$ZTIMESTAMP}, SqlComputed, SqlComputeOnChange = DOB];
- 計算對查詢
- SQL DDL COMPUTECODE和計算或瞬態(tài)關(guān)鍵字Birthday VARCHAR(50) COMPUTECODE {SET {Birthday}=$PIECE($ZDATE({DOB},9),",")_" changed: "_$ZTIMESTAMP}計算
- 持久類定義SqlComputeCode, SqlComputed, and calculate或瞬態(tài)屬性關(guān)鍵字屬性Birthday為%String(MAXLEN = 50) [SqlComputeCode = {SET {Birthday}=$PIECE($ZDATE({DOB},9),",") _" changed: "_$ZTIMESTAMP}, SqlComputed, calculate];
DDL DEFAULT關(guān)鍵字在插入時優(yōu)先于計算數(shù)據(jù)值。
DEFAULT必須接受一個數(shù)據(jù)值,例如空字符串;
不能為空。
在持久類定義中,InitialExpression屬性關(guān)鍵字在插入時不會覆蓋SqlComputed數(shù)據(jù)值。
DDL COMPUTEONCHANGE關(guān)鍵字可以使用單個字段名,也可以使用逗號分隔的字段名列表。
這些字段名指定了哪些字段更新時會觸發(fā)對該字段的計算;
列出的字段名稱必須存在于表中,但它們不必出現(xiàn)在計算代碼中。
必須指定實(shí)際的字段名;
不能指定星號語法。
在修改記錄時,可以使用ON UPDATE關(guān)鍵字短語將字段設(shè)置為文字或系統(tǒng)變量(如當(dāng)前時間戳),而不是使用COMPUTECODE和COMPUTEONCHANGE。
ON UPDATE短語同時修飾INSERT和UPDATE;
若要只在更新時修改,請使用默認(rèn)短語和更新短語。
每次查詢訪問該字段時,DDL計算或TRANSIENT關(guān)鍵字都會計算一個數(shù)據(jù)值。
該字段不需要在選擇列表中指定。
例如,SELECT Name FROM MyTable WHERE LENGTH(Birthday)=36在計算條件表達(dá)式之前計算生日字段。
管理門戶Open Table選項(xiàng)執(zhí)行一個查詢,因此計算計算的和臨時的數(shù)據(jù)值。
計算字段限制:
- 不更新的更新:為記錄中的字段提供與它們之前的值相同的值的更新實(shí)際上并不更新記錄。
如果沒有對記錄執(zhí)行真正的更新,則不會調(diào)用COMPUTEONCHANGE。
即使沒有對一條記錄執(zhí)行真正的更新,也會在更新操作上調(diào)用ON UPDATE。
如果希望在更新時總是重新計算已計算字段,而不管記錄是否實(shí)際更新,請使用更新觸發(fā)器。 - 用戶為計算字段指定的顯式值:
- INSERT:在INSERT時,您總是可以向COMPUTECODE、DEFAULT或On UPDATE字段提供顯式的值。
InterSystems SQL總是采用顯式的值,而不是生成的值。 - 更新COMPUTEONCHANGE:更新操作可以為COMPUTEONCHANGE字段提供顯式的值。
InterSystems SQL總是采用顯式的值,而不是計算的值。 - 更新時更新:更新操作不能為ON UPDATE字段提供顯式值。
InterSystems SQL忽略用戶提供的值,并接受ON UPDATE生成的值。
但是,InterSystems SQL確實(shí)會對顯式值執(zhí)行字段驗(yàn)證,例如,如果提供的值大于最大數(shù)據(jù)大小,就會生成SQLCODE -104錯誤。 - 計算或暫態(tài):插入或更新操作不能為計算或暫態(tài)字段提供顯式值,因?yàn)橛嬎慊驎簯B(tài)字段不存儲數(shù)據(jù)。
但是,InterSystems SQL確實(shí)會對顯式值執(zhí)行字段驗(yàn)證,例如,如果提供的值大于最大數(shù)據(jù)大小,就會生成SQLCODE -104錯誤。
- INSERT:在INSERT時,您總是可以向COMPUTECODE、DEFAULT或On UPDATE字段提供顯式的值。
刪除語句
DELETE語句從SQL表中刪除一條或多條現(xiàn)有記錄:
DELETE FROM MyApp.PersonWHERE HairColor = 'Aqua'可以執(zhí)行TRUNCATE TABLE命令刪除表中的所有記錄。
還可以使用delete刪除表中的所有記錄。
DELETE(默認(rèn)情況下)提取刪除觸發(fā)器;
TRUNCATE TABLE不拉出刪除觸發(fā)器。
使用DELETE刪除所有記錄不會重置表計數(shù)器;
TRUNCATE TABLE重置這些計數(shù)器。
事務(wù)處理
事務(wù)是一系列插入、更新、刪除、插入或更新以及截斷表數(shù)據(jù)修改語句,它們組成單個工作單元。
SET TRANSACTION命令用于設(shè)置當(dāng)前進(jìn)程的事務(wù)參數(shù)。
還可以使用START TRANSACTION命令設(shè)置相同的參數(shù)。
這些事務(wù)參數(shù)在多個事務(wù)中繼續(xù)有效,直到顯式更改為止。
START TRANSACTION命令顯式地啟動事務(wù)。
這個命令通常是可選的;
如果事務(wù)%COMMITMODE是隱式或顯式的,事務(wù)從第一個數(shù)據(jù)庫修改操作自動開始。
如果事務(wù)%COMMITMODE為NONE,則必須顯式指定START transaction來啟動事務(wù)處理。
如果事務(wù)成功,提交其更改可以是隱式(自動)或顯式的;
%COMMITMODE值決定是否需要顯式地使用COMMIT語句來永久地將數(shù)據(jù)修改添加到數(shù)據(jù)庫并釋放資源。
如果事務(wù)失敗,可以使用ROLLBACK語句撤消其數(shù)據(jù)修改,這樣這些數(shù)據(jù)就不會進(jìn)入數(shù)據(jù)庫。
注意:通過管理門戶執(zhí)行SQL查詢接口運(yùn)行SQL時,不支持SQL事務(wù)語句。
這個接口旨在作為開發(fā)SQL代碼的測試環(huán)境,而不是用于修改實(shí)際數(shù)據(jù)。
事務(wù)和保存點(diǎn)
在InterSystems SQL中,可以執(zhí)行兩種事務(wù)處理:完整事務(wù)處理和使用保存點(diǎn)的事務(wù)處理。通過完整的事務(wù)處理,事務(wù)將從START TRANSACTION語句(顯式或隱式)開始,一直持續(xù)到COMMIT語句(顯式或隱式)結(jié)束事務(wù)并提交所有工作,或者ROLLBACK語句反轉(zhuǎn)事務(wù)期間完成的所有工作。
通過保存點(diǎn),InterSystems SQL支持事務(wù)中的級別。可以使用START TRANSACTION語句(顯式或隱式)開始事務(wù)。然后,在事務(wù)期間,可以使用SAVEPOINT在程序中指定一個或多個命名保存點(diǎn)。可以在一個事務(wù)中最多指定255個命名保存點(diǎn)。添加一個保存點(diǎn)會增加$TLEVEL事務(wù)級別計數(shù)器。
- COMMIT提交事務(wù)期間執(zhí)行的所有工作。保存點(diǎn)將被忽略。
- ROLLBACK將回滾事務(wù)期間執(zhí)行的所有工作。保存點(diǎn)將被忽略。
- ROLLBACK TO SAVEPOINT點(diǎn)名將回滾自點(diǎn)名指定的SAVEPOINT以來執(zhí)行的所有工作,并以適當(dāng)數(shù)量的保存點(diǎn)級別將內(nèi)部事務(wù)級別計數(shù)器遞減。例如,如果建立了兩個保存點(diǎn)svpt1和svpt2,然后回滾到svpt1,則ROLLBACK TO SAVEPOINT svpt1會反轉(zhuǎn)自svpt1以來所做的工作,在這種情況下,將事務(wù)級別計數(shù)器減2。
非事務(wù)操作
當(dāng)事務(wù)生效時,以下操作不包括在事務(wù)中,因此無法回滾:
- IDKey計數(shù)器增量不是事務(wù)操作。IDKey由$INCREMENT(或$SEQUENCE)自動生成,它維護(hù)獨(dú)立于SQL事務(wù)的計數(shù)。例如,如果插入IDKey為17、18和19的記錄,然后回滾此插入,則下一條要插入的記錄的IDKey將為20。
- 緩存查詢的創(chuàng)建、修改和清除不是事務(wù)操作。因此,如果在事務(wù)期間清除高速緩存的查詢,然后回滾該事務(wù),則在回滾操作之后,高速緩存的查詢將保持清除狀態(tài)(不會恢復(fù))。
- 事務(wù)內(nèi)發(fā)生的DDL操作或調(diào)諧表操作可以創(chuàng)建和運(yùn)行臨時例程。此臨時例程被視為與緩存查詢相同。也就是說,臨時例程的創(chuàng)建、編譯和刪除不被視為事務(wù)的一部分。臨時例程的執(zhí)行被認(rèn)為是事務(wù)的一部分。
事務(wù)鎖
事務(wù)使用鎖來保護(hù)唯一的數(shù)據(jù)值。例如,如果進(jìn)程刪除了唯一的數(shù)據(jù)值,則該值在事務(wù)持續(xù)時間內(nèi)被鎖定。因此,在第一個事務(wù)完成之前,另一個進(jìn)程無法使用相同的唯一數(shù)據(jù)值插入記錄。這可以防止回滾導(dǎo)致具有唯一性約束的字段出現(xiàn)重復(fù)值。這些鎖由INSERT、UPDATE、INSERT或UPDATE和DELETE語句自動應(yīng)用,除非該語句包含%NOLOCK限制參數(shù)。
事務(wù)大小限制
除了日記文件的空間可用性外,可以在事務(wù)中指定的操作數(shù)量沒有限制。鎖表的大小通常不會施加限制,因?yàn)镮nterSystems IRIS提供自動鎖升級。
每個表有1000個鎖的默認(rèn)鎖閾值。對于當(dāng)前事務(wù),一個表可以有1000個唯一的數(shù)據(jù)值鎖。第100個鎖定操作在事務(wù)持續(xù)時間內(nèi)將該表的鎖定升級為表鎖。
此鎖定閾值可使用以下任一選項(xiàng)進(jìn)行配置:
- 調(diào)用$SYSTEM.SQL.SetLockThreshold()方法。此方法更改當(dāng)前系統(tǒng)范圍的值和配置文件設(shè)置。要確定當(dāng)前的鎖升級閾值,請使用$SYSTEM.SQL.GetLockThreshold()方法。
- 轉(zhuǎn)到管理門戶。從系統(tǒng)管理中,依次選擇配置、SQL和對象設(shè)置、SQL。在此屏幕上,可以查看和編輯鎖定閾值的當(dāng)前設(shè)置。
可以終止的子節(jié)點(diǎn)(子表)的數(shù)量沒有限制。所有子節(jié)點(diǎn)終止都被記錄下來,因此可以回滾。
讀取未提交的數(shù)據(jù)
可以通過為發(fā)出查詢的進(jìn)程設(shè)置SET TRANSACTION或START TRANSACTION來指定讀取隔離級別。
- 提交未提交的隔離級別:對于其他用戶進(jìn)行查詢(只讀)訪問,可以看到未提交的對數(shù)據(jù)的插入,更新和刪除。如果未指定任何事務(wù),則為默認(rèn)設(shè)置。
- 已驗(yàn)證隔離級別:可供其他用戶以查詢(只讀)訪問的方式看到未提交的對數(shù)據(jù)的插入,更新和刪除。提供對查詢條件所使用并由查詢顯示的數(shù)據(jù)的重新檢查。
- 讀取已提交的隔離級別:未提交的插入和更新對數(shù)據(jù)所做的更改未顯示在查詢結(jié)果集中。查詢結(jié)果集僅包含已提交的插入和更新。但是,未提交的刪除對數(shù)據(jù)所做的更改將顯示在查詢結(jié)果集中。
不管當(dāng)前的隔離級別如何,以下SELECT命令子句始終返回未提交的數(shù)據(jù):聚合函數(shù),DISTINCT子句,GROUP BY子句或帶有%NOLOCK關(guān)鍵字的SELECT。
ObjectScript事務(wù)命令
ObjectScript和SQL事務(wù)命令是完全兼容和可互換的,但以下情況除外:
如果沒有當(dāng)前事務(wù),則ObjectScript TSTART和SQL START TRANSACTION都將啟動一個事務(wù)。但是,START TRANSACTION不支持嵌套事務(wù)。因此,如果需要(或可能需要)嵌套事務(wù),則最好使用TSTART啟動事務(wù)。如果需要與SQL標(biāo)準(zhǔn)兼容,請使用START TRANSACTION。
ObjectScript事務(wù)處理為嵌套事務(wù)提供了有限的支持。 SQL事務(wù)處理為事務(wù)中的保存點(diǎn)提供支持。
總結(jié)
以上是生活随笔為你收集整理的第八章 SQL修改数据库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 送给女朋友的java程序_逗女朋友开心的
- 下一篇: 事务处理:概念与技术