第七章 SQL表之間的關係

2021-10-21 18:13:53 字數 4285 閱讀 8981

父表和子表

要在表之間強制執行引用完整性,可以定義外來鍵。修改包含外來鍵約束的表時,將檢查外來鍵約束。

有幾種方法可以在intersystems sql中定義外來鍵:

用作外來鍵引用的rowid字段必須是公共的。引用隱藏的rowid?有關如何使用公用(或專用)rowid字段定義表的資訊。

乙個表(類)的外來鍵最大數目為400。

外來鍵約束可以指定更新或刪除時的引用操作。

create table reference action子句中描述了使用ddl定義這個引用操作。

在類定義引用的ondeleteonupdate外來鍵關鍵字中定義了乙個持久化類來定義這個引用操作,該類投射到乙個表。

在建立分片表時,這些引用操作必須設定為無操作。

預設情況下,intersystemsiris®資料平台對insertupdatedelete操作執行外來鍵引用完整性檢查。如果該操作將違反參照完整性,則不會執行;該操作將發出sqlcode -121,-122,-123或-124錯誤。參照完整性檢查失敗會生成如下錯誤:

錯誤#5540:sqlcode:-

124訊息:表'healthlanguage.fkey2'中至少存在1行,該行引用鍵newindex1-外來鍵約束'newforeignkey1'(字段'pointer1')的no action引用操作失敗[execute +

5^ irissql16:user]

可以使用$system.sql.setfilerrefintegrity()方法在系統範圍內禁止此檢查。若要確定當前設定,請呼叫$system.sql.currentsettings()

預設情況下,當刪除帶有外來鍵的行時,intersystems iris將在相應的被引用表的行上獲取長期(直到事務結束)共享鎖。這樣可以防止在引用行上的delete事務完成之前對引用行進行更新或刪除。這樣可以防止刪除引用行,然後回退刪除引用行的情況。如果發生這種情況,外來鍵將引用不存在的行。如果使用nocheck定義外來鍵,或者使用%nocheck%nolock指定引用行的delete,則不會獲取此鎖定。

使用永續性類定義定義表時,可以使用nocheck關鍵字定義外來鍵,以禁止將來對該外來鍵進行檢查。create table不提供此關鍵字選項。

可以使用%nocheck關鍵字選項禁止檢查特定操作。

預設情況下,intersystems iris還對以下操作執行外來鍵引用完整性檢查。如果指定的操作違反了引用完整性,則不執行該命令:

在父/子關係中,沒有定義子元素的順序。

應用程式**不能依賴於任何特定的順序。

在定義投射到表的持久類時,可以使用relationship屬性指定兩個表之間的父/子關係。

下面的例子定義了父表:

class sample.invoice extends %persistent 

下面的例子定義了乙個子表:

class sample.lineitem extends %persistent 

注意這兩句話:

在management portal sql inte***ce catalog details選項卡中,表資訊提供了子表和/或父表的名稱。

如果是子表,則提供對父表的引用,如:parent->sample.invoice

子表本身可以是子表的父表。

(子表的子表被稱為「孫」表。)

在本例中,表info提供了父表和子表的名稱。

在將相應的記錄插入子表之前,必須將每個記錄插入父表。

例如:

insert into sample.invoice (buyer,invoicedate) values (

嘗試插入沒有對應父記錄id的子記錄時,會使用%msg子表'sample生成sqlcode -104錯誤。 lineitem'引用父表中不存在的行。

在子表上的插入操作期間,在父表的相應行上獲得共享鎖。

在插入子表行時,該行被鎖定。

然後,鎖被釋放(直到事務結束時才被持有)。

這確保了在插入操作期間引用的父行不會被更改。

在嵌入式sql中,可以使用主機變數陣列來標識父表和子表。

在子表中,主機變數陣列的下標0被設定為父引用(cparent),格式為parentref,下標1被設定為子記錄id,格式為parentref|| childf

在父表中,沒有定義下標0。

如下面的例子所示:

/// d ##class(pha.test.sql).fatherchildtable()

classmethod fatherchildtable()

&sql

(fetch c1)

if sqlcode=

100 while $data

(tflds(0

))} if $data

(tflds(0

))=0

&sql

(close c1)

if sqlcode<

0}

(pha.test.sql)

.fatherchildtable()

sample.invoice 是父表

/// d ##class(pha.test.sql).fatherchildtable1()

classmethod fatherchildtable1()

&sql

(fetch c2)

if sqlcode=

100 while $data

(tflds(0

))} if $data

(tflds(0

))=0

&sql

(close c2)

if sqlcode<

0}

對於子表,tflds(0)tflds(1)返回如下值:

(pha.test.sql)

.fatherchildtable1()

sample.lineitem 是乙個子表

parent ref:

1%id:1||

1sample.lineitem 是乙個子表

parent ref:

1%id:1||

2對於「孫」表(即子表的子表),tflds(0)tflds(1)返回如下值:

parent ref:1||

1%id:1||

1||1parent ref:1||

1%id:1||

1||7parent ref:1||

1%id:1||

1||8parent ref:1||

2%id:1||

2||2parent ref:1||

2%id:1||

2||3parent ref:1||

2%id:1||

2||4parent ref:1||

2%id:1||

2||5parent ref:1||

2%id:1||

2||6

python第七章 python教程(第七章)

字典和集合 字典是python中唯一,乙個對映型別 如何建立乙個字典,如下 dict dict 滲透 網路安全 怎麼理解字典呢?現實生活中的字典可以通過首字母進行查詢要查詢的漢子,python也可以這樣理解,通過 前的元素查詢到冒號後的元素。為什麼說字典是唯一乙個對映型別呢?看圖。對映型別區別與序列...

第七章 函式

1.ansi c 允許函式原型的使用,函式宣告提供給編譯器和之後的呼叫函式返回值型別,引數型別和數量的資訊,而k c用單獨的列表給出引數的型別,編譯器只記住函式的返回值型別,但不儲存函式的引數數量和型別 2.沒有return語句的函式,隱式的返回 3.函式的原型可以單獨放於乙個標頭檔案中,一定要具有...

第七章總結

7.2.2畫直線 畫直線使用cdc類的lineto 函式兩個過載版本 bool lineto int x,int y bool lineto point point 引數x y或point指定直線的終點位置,此函式從當前點到指定的終點之間畫一條直線,當前點包括在直線上,而終點不包括在直線上。如果畫線...