第五十四章 SQL命令 INSERT(三)

第五十四章 SQL命令 INSERT(三)

SQLCODE錯(cuò)誤

默認(rèn)情況下,INSERT是要么全有要么全無(wú)的事件:要么完全插入行,要么根本不插入行。 IRIS返回一個(gè)狀態(tài)變量SQLCODE,指示插入是成功還是失敗。要將行插入到表中,插入操作必須滿(mǎn)足所有表、字段名和字段值要求,如下所示。

表:

  • 該表必須已經(jīng)存在。嘗試插入到不存在的表會(huì)導(dǎo)致SQLCODE-30錯(cuò)誤。
  • 不能將該表定義為READONLY。嘗試編譯引用ReadOnly表的插入會(huì)導(dǎo)致SQLCODE-115錯(cuò)誤。請(qǐng)注意,此錯(cuò)誤是在編譯時(shí)發(fā)出的,而不是在執(zhí)行時(shí)發(fā)出的。
  • 如果通過(guò)視圖更新表,則不能將該視圖定義為只讀。嘗試這樣做會(huì)導(dǎo)致SQLCODE-35錯(cuò)誤。如果視圖基于分割表,則不能通過(guò)使用CHECK OPTION定義的視圖進(jìn)行插入。嘗試這樣做會(huì)導(dǎo)致SQLCODE-35,其中不允許基于帶有CHECK選項(xiàng)條件的切片表的視圖(sample.myview)使用%msg INSERT/UPDATE/DELETE
  • 必須具有適當(dāng)?shù)臋?quán)限才能插入表

字段名稱(chēng):

  • 該字段必須存在。嘗試插入不存在的字段會(huì)導(dǎo)致SQLCODE-29錯(cuò)誤。
  • 插入必須指定所有必填字段。嘗試插入行而不為必填字段指定值會(huì)導(dǎo)致SQLCODE-108錯(cuò)誤。
  • 插入不能包含重復(fù)的字段名稱(chēng)。嘗試插入包含兩個(gè)同名字段的行會(huì)導(dǎo)致SQLCODE-377錯(cuò)誤。
  • 插入不能包含定義為READONLY的字段。嘗試編譯引用READONLY字段的插入會(huì)導(dǎo)致SQLCODE-138錯(cuò)誤。請(qǐng)注意,此錯(cuò)誤現(xiàn)在在編譯時(shí)發(fā)出,而不是僅在執(zhí)行時(shí)發(fā)出。使用鏈接表向?qū)ф溄颖頃r(shí),可以選擇將字段定義為只讀。源系統(tǒng)上的字段可能不是只讀的,但如果IRIS將鏈接表的字段定義為只讀,則嘗試引用此字段的INSERT將導(dǎo)致SQLCODE-138錯(cuò)誤。

字段值:

  • 每個(gè)字段值都必須通過(guò)數(shù)據(jù)類(lèi)型驗(yàn)證。嘗試插入不適合該字段數(shù)據(jù)類(lèi)型的字段值會(huì)導(dǎo)致SQLCODE-104錯(cuò)誤。請(qǐng)注意,這僅適用于插入的數(shù)據(jù)值;如果采用字段的默認(rèn)值,則不必通過(guò)數(shù)據(jù)類(lèi)型驗(yàn)證或數(shù)據(jù)大小驗(yàn)證。

    • 數(shù)據(jù)類(lèi)型不匹配:決定是否合適的是字段的數(shù)據(jù)類(lèi)型,而不是插入數(shù)據(jù)的類(lèi)型。例如,除非字符串通過(guò)當(dāng)前模式的日期驗(yàn)證,否則嘗試將字符串?dāng)?shù)據(jù)類(lèi)型值插入日期字段會(huì)失?。坏?,嘗試將日期數(shù)據(jù)類(lèi)型值插入字符串字段會(huì)成功,將日期作為文字字符串插入。可以使用CONVERT函數(shù)將數(shù)據(jù)轉(zhuǎn)換為目標(biāo)數(shù)據(jù)類(lèi)型。
    • 數(shù)據(jù)大小不匹配:數(shù)據(jù)值必須在字段的MAXLENMAXVALMINVAL范圍內(nèi)。例如,試圖將長(zhǎng)度超過(guò)24個(gè)字符的字符串插入到定義為VARCHAR(24)的字段中,或試圖將大于127個(gè)字符的數(shù)字插入到定義為TINYINT的字段中,將導(dǎo)致SQLCODE-104錯(cuò)誤。
    • 數(shù)字類(lèi)型不匹配:如果通過(guò)ODBCJDBC提供了無(wú)效的雙精度數(shù),則會(huì)出現(xiàn)SQLCODE-104錯(cuò)誤。
  • 每個(gè)字段值必須將顯示傳遞到邏輯模式轉(zhuǎn)換。嘗試以無(wú)法轉(zhuǎn)換為邏輯存儲(chǔ)值的格式插入字段值會(huì)導(dǎo)致SQLCODE-146錯(cuò)誤(對(duì)于日期)或SQLCODE-147錯(cuò)誤(對(duì)于時(shí)間)。

  • 每個(gè)字段值都必須通過(guò)數(shù)據(jù)約束驗(yàn)證:

    • 必須為定義為NOT NULL的字段提供數(shù)據(jù)值。如果沒(méi)有默認(rèn)值,則不指定數(shù)據(jù)值將導(dǎo)致SQLCODE-108錯(cuò)誤,表明沒(méi)有指定必填字段。
    • 字段值必須符合唯一性約束。嘗試在具有唯一性約束的字段(或字段組)中插入重復(fù)字段值會(huì)導(dǎo)致SQLCODE-119錯(cuò)誤。如果字段具有唯一數(shù)據(jù)約束,或者如果已將唯一字段約束應(yīng)用于一組字段,則返回此錯(cuò)誤。如果為唯一字段或主鍵字段指定了重復(fù)的值,或者未指定值并且第二次使用該字段的默認(rèn)值將提供重復(fù)的值,則可能會(huì)發(fā)生此錯(cuò)誤。SQLCODE-119%msg字符串包括違反唯一性約束的字段和值。例如:<Table 'Sample.MyTable', Constraint 'MYTABLE_UNIQUE3', Field(s) FullName="Molly Bloom"; failed unique check> or <Table 'Sample.MyTable', Constraint 'MYTABLE_PKEY2', Field(s) FullName="Molly Bloom"; failed unique check>
    • 使用VALUELIST參數(shù)定義為永久類(lèi)屬性的字段只能接受VALUELIST中列出的值之一作為有效值,或者不提供任何值(NULL)VALUELIST有效值區(qū)分大小寫(xiě)。指定與VALUELIST值不匹配的數(shù)據(jù)值會(huì)導(dǎo)致SQLCODE-104字段值未通過(guò)驗(yàn)證錯(cuò)誤。
  • 數(shù)字以規(guī)范形式插入,但可以使用前導(dǎo)和尾隨零以及多個(gè)前導(dǎo)符號(hào)指定。但是,在SQL中,兩個(gè)連續(xù)的減號(hào)被解析為單行注釋指示符。因此,嘗試使用兩個(gè)連續(xù)的前導(dǎo)減號(hào)指定一個(gè)數(shù)字會(huì)導(dǎo)致SQLCODE-12錯(cuò)誤。

  • 默認(rèn)情況下,INSERT不能為系統(tǒng)生成值的字段指定值,例如RowID、IDKeyIdentity字段。默認(rèn)情況下,嘗試為這些字段中的任何一個(gè)插入非空字段值都會(huì)導(dǎo)致SQLCODE-111錯(cuò)誤。嘗試為其中一個(gè)字段插入NULL會(huì)導(dǎo)致IRIS使用系統(tǒng)生成的值覆蓋NULL;插入成功完成,并且不會(huì)發(fā)出錯(cuò)誤代碼。

如果定義了數(shù)據(jù)類(lèi)型為ROWVERSION的字段,則在插入行時(shí)會(huì)自動(dòng)為其分配系統(tǒng)生成的計(jì)數(shù)器值。嘗試將值插入ROWVERSION字段會(huì)導(dǎo)致SQLCODE-138錯(cuò)誤。

可以使IDENTITY字段接受用戶(hù)指定的值。
通過(guò)設(shè)置SetOption(“IdentityInsert”)方法,您可以覆蓋IDENTITY字段的默認(rèn)約束,并允許將唯一整數(shù)值插入IDENTITY字段。
(可以通過(guò)調(diào)用GetOption(“IdentityInsert”)方法返回該約束的當(dāng)前設(shè)置。)
插入IDENTITY字段值將更改IDENTITY計(jì)數(shù)器,以便后續(xù)系統(tǒng)生成的值從這個(gè)用戶(hù)指定的值遞增。
試圖為IDENTITY字段插入NULL將產(chǎn)生SQLCODE -108錯(cuò)誤。

IDKey數(shù)據(jù)有以下限制:
因?yàn)樗饕械亩鄠€(gè)IDKey字段是用“||”(雙豎條)字符分隔的,所以不能在IDKey字段數(shù)據(jù)中包含這個(gè)字符串。

插入不能包含值違反外鍵引用完整性的字段,除非指定了%NOCHECK關(guān)鍵字,或者外鍵是用NOCHECK關(guān)鍵字定義的。
否則,嘗試違反外鍵引用完整性的插入將導(dǎo)致SQLCODE -121錯(cuò)誤,并帶有%msg,如下所示:<Table 'Sample.MyTable', Foreign Key Constraint 'MYTABLEFKey2', Field(s) FULLNAME failed referential integrity check>

  • 字段值不能是子查詢(xún)。
    試圖將子查詢(xún)指定為字段值將導(dǎo)致SQLCODE -144錯(cuò)誤。

插入操作

Privileges

要將一行或多行數(shù)據(jù)插入到表中,您必須擁有該表的表級(jí)特權(quán)或列級(jí)特權(quán)。

表級(jí)權(quán)限

  • 用戶(hù)必須對(duì)指定的表具有INSERT權(quán)限。
  • 如果使用SELECT查詢(xún)從另一個(gè)表插入數(shù)據(jù),用戶(hù)必須對(duì)該表具有SELECT權(quán)限。

如果用戶(hù)是該表的Owner(創(chuàng)建者),則自動(dòng)授予該用戶(hù)對(duì)該表的所有特權(quán)。
否則,必須向用戶(hù)授予該表的權(quán)限。
如果不這樣做,將導(dǎo)致一個(gè)帶有%msgSQLCODE -99錯(cuò)誤。
可以通過(guò)調(diào)用%CHECKPRIV命令來(lái)確定當(dāng)前用戶(hù)是否具有適當(dāng)?shù)奶貦?quán)。
可以使用GRANT命令分配用戶(hù)表權(quán)限。

要插入到分片表,您必須對(duì)目標(biāo)表具有insert權(quán)限。
如果沒(méi)有這些權(quán)限會(huì)出現(xiàn)SQLCODE -253錯(cuò)誤:Sharded INSERT/UPDATE/DELETE run-time error

表級(jí)特權(quán)相當(dāng)于(但不完全相同)在表的所有列上擁有列級(jí)特權(quán)。

列級(jí)權(quán)限

如果沒(méi)有表級(jí)的INSERT權(quán)限,則必須對(duì)表中的至少一列具有列級(jí)的INSERT權(quán)限。
要將指定的值插入到列中,必須對(duì)該列具有列級(jí)insert權(quán)限。
只有具有INSERT權(quán)限的列才能接收INSERT命令中指定的值。

如果對(duì)指定的列沒(méi)有列級(jí)INSERT權(quán)限, SQL將插入列的默認(rèn)值(如果定義了)或NULL(如果沒(méi)有定義默認(rèn)值)。
如果對(duì)沒(méi)有默認(rèn)值且定義為not NULL的列沒(méi)有INSERT權(quán)限, IRIS會(huì)在Prepare時(shí)間發(fā)出SQLCODE -99 (privilege Violation)錯(cuò)誤。

如果INSERT命令指定結(jié)果集SELECTWHERE子句中的字段,則如果這些字段不是數(shù)據(jù)插入字段,則必須具有這些字段的SELECT權(quán)限,如果這些字段包含在結(jié)果集中,則必須具有這些字段的SELECTINSERT權(quán)限。

當(dāng)屬性被定義為ReadOnly時(shí),相應(yīng)的表字段也被定義為ReadOnly。
只讀字段只能使用InitialExpressionSqlComputed賦值。
嘗試為具有列級(jí)ReadOnly (SELECT或REFERENCES)權(quán)限的字段插入值將導(dǎo)致SQLCODE -138錯(cuò)誤:無(wú)法為只讀字段插入/更新值。

可以使用%CHECKPRIV來(lái)確定是否具有適當(dāng)?shù)牧屑?jí)特權(quán)。

快速插入

當(dāng)使用JDBC在表中插入行時(shí) IRIS默認(rèn)情況下會(huì)自動(dòng)執(zhí)行高效的Fast Insert操作。
Fast Insert將插入的數(shù)據(jù)的規(guī)范化和格式化從服務(wù)器轉(zhuǎn)移到客戶(hù)機(jī)。
然后,服務(wù)器可以直接將表的整行數(shù)據(jù)設(shè)置為全局?jǐn)?shù)據(jù),而無(wú)需對(duì)服務(wù)器進(jìn)行操作。
這將這些任務(wù)從服務(wù)器轉(zhuǎn)移到客戶(hù)機(jī)上,可以顯著提高INSERT性能。
由于客戶(hù)端承擔(dān)了格式化數(shù)據(jù)的任務(wù),因此在客戶(hù)端環(huán)境中可能會(huì)出現(xiàn)不可預(yù)見(jiàn)的使用量增加。
如果有問(wèn)題,可以使用FeatureOption屬性禁用快速插入。

服務(wù)器和客戶(hù)端都必須支持快速插入。
要在客戶(hù)端中啟用或禁用Fast Insert,請(qǐng)?jiān)陬?lèi)實(shí)例的定義中使用FeatureOption屬性,如下所示:

Properties p = new Properties();
p.setProperty("FeatureOption","3");   / 2 is fast Insert, 1 is fast Select, 3 is both

如果Fast Insert是活動(dòng)的,則使用緩存查詢(xún)執(zhí)行的Insert將使用Fast Insert執(zhí)行。
生成緩存查詢(xún)的初始INSERT不是使用Fast INSERT執(zhí)行的。
這使能夠比較初始插入與使用緩存查詢(xún)執(zhí)行的后續(xù)Fast Inserts的性能。
如果不支持快速插入(出于以下原因),則執(zhí)行普通插入。

快速插入必須在表上執(zhí)行。
不能在可更新視圖上執(zhí)行。
當(dāng)表具有以下任何特征時(shí),不執(zhí)行快速插入:

  • 該表使用嵌入式(嵌套)存儲(chǔ)結(jié)構(gòu)(%SerialObject)。
  • 該表是一個(gè)鏈接的表。
  • 該表是子表。
  • 該表有一個(gè)顯式定義的多字段IDKEY索引。
  • 該表有一個(gè)SERIAL (%Counter)、AUTO_INCREMENT%RowVersion字段。
  • 該表有一個(gè)屬性(字段),帶有定義的VALUELIST參數(shù)。
  • 表有一個(gè)已定義的插入觸發(fā)器。
  • 該表執(zhí)行字段值的LogicalToStorage轉(zhuǎn)換。
  • 這個(gè)表是一個(gè)Shard Master表。

如果Insert語(yǔ)句具有以下特征之一,則不能執(zhí)行快速插入:

  • 它指定一個(gè)流字段((數(shù)據(jù)類(lèi)型%stream.GlobalCharacter%Stream.GlobalBinary)、集合字段(列表或數(shù)組)或只讀字段。
    這些類(lèi)型的字段可以存在于表中,但不能在INSERT中指定。
  • 它指定一個(gè)用雙括號(hào)括起來(lái)的字面值,禁止字面值替換。
    例如,((A))。
  • 它指定一個(gè)省略日期值的{ts}時(shí)間戳值。
  • 它包括一個(gè)DEFAULT VALUES子句。

對(duì)于SQL xDBC語(yǔ)句審計(jì)事件,使用Fast INSERT接口的INSERT語(yǔ)句具有SQL fastINSERT語(yǔ)句的描述。
如果使用Fast Insert接口,則Audit事件不包括任何參數(shù)數(shù)據(jù),但包括消息參數(shù)值對(duì)于fastInsert語(yǔ)句不可用。

參照完整性

如果沒(méi)有指定%NOCHECK關(guān)鍵字, IRIS將使用系統(tǒng)范圍的配置設(shè)置來(lái)確定是否執(zhí)行外鍵引用完整性檢查;
默認(rèn)值是執(zhí)行外鍵引用完整性檢查。
您可以在系統(tǒng)范圍內(nèi)設(shè)置此默認(rèn)值,如外鍵引用完整性檢查中所述。
要確定當(dāng)前系統(tǒng)范圍的設(shè)置,調(diào)用$SYSTEM.SQL.CurrentSettings()

此設(shè)置不適用于用NOCHECK關(guān)鍵字定義的外鍵。

在INSERT操作期間,對(duì)于每個(gè)外鍵引用,都會(huì)在引用表中相應(yīng)的行上獲得一個(gè)共享鎖。
在執(zhí)行引用完整性檢查和插入該行時(shí),此行被鎖定。
然后釋放鎖(直到事務(wù)結(jié)束才持有鎖)。
這確保了引用的行不會(huì)在引用完整性檢查和插入操作完成之間發(fā)生更改。

但是,如果指定了%NOLOCK關(guān)鍵字,則不會(huì)對(duì)指定的表或引用表中相應(yīng)的外鍵行執(zhí)行鎖操作。

子表插入

在對(duì)子表執(zhí)行INSERT操作期間,父表中相應(yīng)行的共享鎖將被獲取。
在插入子表行時(shí),此行被鎖定。
然后釋放鎖(直到事務(wù)結(jié)束才持有鎖)。
這確保在插入操作期間不會(huì)更改引用的父行。

原子性

默認(rèn)情況下,INSERT、UPDATE、DELETETRUNCATE TABLE是原子操作。
INSERT要么成功完成,要么回滾整個(gè)操作。
如果不能插入任何指定的行,則不插入任何指定的行,并且數(shù)據(jù)庫(kù)恢復(fù)到發(fā)出INSERT之前的狀態(tài)。

可以通過(guò)調(diào)用SET TRANSACTION %COMMITMODE來(lái)修改SQL中當(dāng)前進(jìn)程的這個(gè)默認(rèn)值。
可以通過(guò)調(diào)用SetOption()方法在ObjectScript中修改當(dāng)前進(jìn)程的這個(gè)默認(rèn)值,如下SET status=$SYSTEM.SQL.Util.SetOption("AutoCommit",intval,.oldval)。
以下intval整數(shù)選項(xiàng)是可用的:

  • 1IMPLICIT (autocommit on)——默認(rèn)行為,如上所述。
    每個(gè)INSERT構(gòu)成一個(gè)單獨(dú)的事務(wù)。
  • 2EXPLICIT (autocommit off)——如果沒(méi)有事務(wù)在進(jìn)行,INSERT會(huì)自動(dòng)啟動(dòng)一個(gè)事務(wù),但必須顯式地COMMITROLLBACK來(lái)結(jié)束事務(wù)。
    EXPLICIT模式下,每個(gè)事務(wù)的數(shù)據(jù)庫(kù)操作數(shù)是用戶(hù)定義的。
  • 0NONE(沒(méi)有自動(dòng)事務(wù))——調(diào)用INSERT時(shí)不會(huì)啟動(dòng)任何事務(wù)。
    INSERT操作失敗可能會(huì)使數(shù)據(jù)庫(kù)處于不一致的狀態(tài),一些指定的行被插入,而一些未插入。
    要在此模式中提供事務(wù)支持,必須使用START transaction來(lái)啟動(dòng)事務(wù),并使用COMMITROLLBACK來(lái)結(jié)束事務(wù)。

分片表始終沒(méi)有自動(dòng)事務(wù)模式,這意味著對(duì)分片表的所有插入、更新和刪除都是在事務(wù)范圍之外執(zhí)行的。

可以使用GetOption(“AutoCommit”)方法確定當(dāng)前進(jìn)程的原子性設(shè)置,如下面的ObjectScript示例所示:

ClassMethod Insert1()
{
    s stat = $SYSTEM.SQL.SetOption("AutoCommit",$RANDOM(3),.oldval)
    if stat '= 1 {
        w "SetOption 失敗:" 
        d $System.Status.DisplayError(stat) 
        q
    }
    s x = $SYSTEM.SQL.GetOption("AutoCommit")
    if x = 1 {
        w "默認(rèn)的原子性行為r",!
        w "自動(dòng)提交或回滾" 
    } elseif x = 0 {
        w "沒(méi)有啟動(dòng)事務(wù),就沒(méi)有原子性:",!
        w "DELETE失敗會(huì)導(dǎo)致數(shù)據(jù)庫(kù)不一致",!
        w "不支持回滾" 
    } else { 
        w "需要顯式提交或回滾" 
    }
}

事務(wù)鎖

如果沒(méi)有指定%NOLOCK關(guān)鍵字,系統(tǒng)將自動(dòng)對(duì)INSERT、UPDATEDELETE操作執(zhí)行標(biāo)準(zhǔn)的記錄鎖定。
在當(dāng)前事務(wù)期間,每個(gè)受影響的記錄(行)都被鎖定。

默認(rèn)的鎖閾值是每個(gè)表1000個(gè)鎖。
這意味著,如果在事務(wù)期間從表中插入超過(guò)1000條記錄,就會(huì)達(dá)到鎖閾值 IRIS會(huì)自動(dòng)將鎖級(jí)別從記錄鎖升級(jí)為表鎖。
這允許在事務(wù)期間進(jìn)行大規(guī)模插入,而不會(huì)溢出鎖表。

IRIS應(yīng)用以下兩種鎖升級(jí)策略之一:

  • “E”類(lèi)型的鎖升級(jí): IRIS使用這種類(lèi)型的鎖升級(jí),如果以下條件為真:
    持久性(可以從Management Portal SQL模式顯示的Catalog Details中確定這一點(diǎn))。
    (2)類(lèi)要么不指定IDKey索引,要么指定單一屬性的IDKey索引。
    “E”類(lèi)型的鎖升級(jí)在ObjectScript Reference中的lock命令中進(jìn)行了描述。
  • 傳統(tǒng)SQL鎖升級(jí):類(lèi)不使用“E”類(lèi)型鎖升級(jí)的最可能的原因是存在一個(gè)多屬性IDKey索引。
    在本例中,每個(gè)%Save都會(huì)增加鎖計(jì)數(shù)器的值。
    這意味著如果在事務(wù)中保存單個(gè)對(duì)象1001次, IRIS將嘗試升級(jí)鎖。

對(duì)于這兩種鎖升級(jí)策略,您可以使用$SYSTEM.SQL.Util.GetOption(“LockThreshold”)方法確定當(dāng)前系統(tǒng)范圍的鎖閾值。
默認(rèn)值是1000
這個(gè)系統(tǒng)范圍的鎖閾值是可配置的:

  • 使用$SYSTEM.SQL.Util.SetOption("LockThreshold")方法。
  • 使用管理門(mén)戶(hù),選擇系統(tǒng)管理、配置、SQL和對(duì)象設(shè)置、SQL。
    顯示和編輯鎖定升級(jí)閾值的當(dāng)前設(shè)置。
    默認(rèn)值是1000個(gè)鎖。
    如果更改此設(shè)置,則更改后啟動(dòng)的任何新進(jìn)程都將具有新設(shè)置。

需要在“%Admin Manage Resource”中具有“USE”權(quán)限才能修改鎖定閾值。
IRIS會(huì)立即將對(duì)鎖閾值的任何更改應(yīng)用到所有當(dāng)前進(jìn)程。

自動(dòng)鎖升級(jí)的潛在后果是,當(dāng)試圖升級(jí)到表鎖的進(jìn)程與持有該表中記錄鎖的另一個(gè)進(jìn)程沖突時(shí),可能發(fā)生死鎖情況。
有幾種可能的策略可以避免這種情況:(1)增加鎖升級(jí)閾值,以便鎖升級(jí)不太可能在事務(wù)中發(fā)生。
(2)大幅降低鎖升級(jí)閾值,以便鎖升級(jí)幾乎立即發(fā)生,從而減少其他進(jìn)程鎖定同一表中的記錄的機(jī)會(huì)。
(3)在事務(wù)期間應(yīng)用表鎖,不執(zhí)行記錄鎖。
這可以在事務(wù)開(kāi)始時(shí)指定LOCK TABLE,然后指定UNLOCK TABLE(不帶IMMEDIATE關(guān)鍵字,以便表鎖一直持續(xù)到事務(wù)結(jié)束),然后使用%NOLOCK選項(xiàng)執(zhí)行插入操作。

自動(dòng)鎖升級(jí)旨在防止鎖表溢出。
但是,如果執(zhí)行大量插入操作導(dǎo)致出現(xiàn)<LOCKTABLEFULL>錯(cuò)誤,INSERT將發(fā)出SQLCODE -110錯(cuò)誤。

行級(jí)安全性

IRIS行級(jí)安全性允許INSERT添加行,即使定義了行安全性,也不允許隨后訪問(wèn)該行。為確保INSERT不會(huì)阻止隨后對(duì)該行進(jìn)行SELECT訪問(wèn),建議通過(guò)具有WITH CHECK選項(xiàng)的視圖執(zhí)行INSERT。

Microsoft Access

要使用INSERT通過(guò)Microsoft Access將數(shù)據(jù)添加到 IRIS表格中,請(qǐng)將表格RowID字段標(biāo)記為專(zhuān)用,或者在一個(gè)或多個(gè)附加字段上定義唯一索引。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容