日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

第八章 SQL修改数据库

發(fā)布時間:2024/3/13 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第八章 SQL修改数据库 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 第八章 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表中。
可以插入一條記錄或多條記錄。

下面的示例插入一條記錄。
它是插入單個記錄的幾種可用語法形式之一:

INSERT INTO MyApp.Person(Name,HairColor) VALUES ('Fred Rogers','Black')

以下示例通過查詢現(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錯誤。

刪除語句

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。