父表和子表
要在表之間強制執行引用完整性,可以定義外來鍵。修改包含外來鍵約束的表時,將檢查外來鍵約束。
有幾種方法可以在intersystems sql中定義外來鍵:
用作外來鍵引用的rowid
字段必須是公共的。引用隱藏的rowid
?有關如何使用公用(或專用)rowid
字段定義表的資訊。
乙個表(類)的外來鍵最大數目為400。
外來鍵約束可以指定更新或刪除時的引用操作。
在create table reference action
子句中描述了使用ddl定義這個引用操作。
在類定義引用的ondelete
和onupdate
外來鍵關鍵字中定義了乙個持久化類來定義這個引用操作,該類投射到乙個表。
在建立分片表時,這些引用操作必須設定為無操作。
預設情況下,intersystemsiris®資料平台對insert
,update
和delete
操作執行外來鍵引用完整性檢查。如果該操作將違反參照完整性,則不會執行;該操作將發出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指定直線的終點位置,此函式從當前點到指定的終點之間畫一條直線,當前點包括在直線上,而終點不包括在直線上。如果畫線...