唯一字段約束對多個字段的組合值施加唯一值約束。它具有以下語法:
CONSTRAINT uname UNIQUE (f1,f2)
此約束指定字段f1
和f2
的值組合必須始終是唯一的,即使這兩個字段本身的值可能不是唯一的??梢詾榇思s束指定一個、兩個或多個字段。
此約束中指定的所有字段都必須在字段定義中定義。如果在此約束中指定的字段沒有出現在字段定義中,則會生成SQLCODE-86
錯誤。指定的字段應定義為非空。任何指定的字段都不應定義為唯一的,因為這會使指定此約束變得毫無意義。
字段可以按任何順序指定。字段順序指定相應索引定義的字段順序。允許重復的字段名稱。雖然可以在唯一字段約束中指定單個字段名稱,但這與為該字段指定唯一數據約束在功能上是相同的。單字段約束確實提供了約束名稱以供將來使用。
可以在表定義中指定多個唯一字段約束語句。約束語句可以在字段定義中的任何位置指定;按照慣例,它們通常放在已定義字段列表的末尾。
Constraint
關鍵字和唯一字段約束名稱是可選的。以下各項在功能上等效:
CONSTRAINT myuniquefields UNIQUE (name,dateofbirth)UNIQUE (name,dateofbirth)
約束名唯一地標識約束,并且還用于派生相應的索引名。 建議指定約束名稱; 當使用ALTER TABLE
命令從表定義中刪除約束時,需要此約束名。 約束名稱可以是任何有效的標識符; 如果指定為分隔符,則約束名可以包含".", "^", ",", "->"
字符。
ALTER TABLE
無法刪除約束UNIQUE
中列出的列。嘗試這樣做會生成SQLCODE-322
錯誤。
在 SQL 中,每條記錄都由一個唯一的整數值標識,稱為 RowID
。在 SQL 中,不需要指定 RowID
字段。創建表并指定所需的數據字段時,會自動創建 RowID
字段。此 RowID
在內部使用,但未映射到類屬性。默認情況下,它的存在僅在類投影到 SQL 表時可見。在這個投影的 SQL 表中,會出現一個額外的 RowID
字段。默認情況下,此字段命名為“ID”
并分配給第 1 列。
默認情況下,RowID
是隱藏和私有的。指定%PUBLICROWID
關鍵字使RowID
不會隱藏和公開。如果指定%PUBLICROWID
關鍵字,則使用“not SqlRowIdPrivate”
定義與表對應的類。此可選關鍵字可以在逗號分隔的表元素列表中的任何位置指定。ALTER TABLE
不能用于指定%PUBLICROWID
。
如果RowID
是公共的:
RowID
值通過select *
顯示。RowID
可以用作外鍵引用。RowID
將被視為具有約束名稱RowIDField_As_PKey
的隱式主鍵約束。使用CREATE TABLE
創建表時,缺省情況下, IRIS會自動定義相應類的位圖范圍索引。位圖區索引的SQL MapName
為%%DDLBEIndex
:
Index DDLBEIndex [ Extent, SqlName = "%%DDLBEIndex", Type = bitmap ];
在以下任何情況下都不會創建該位圖范圍索引:
IDKEY
索引。MINVAL=1
。$SYSTEM.SQL.Util.SetOption()
方法DDLDefineBitmapExtent
選項設置為0以覆蓋系統范圍的默認設置。要確定當前設置,請調用$SYSTEM.SQL.CurrentSettings()
方法,該方法顯示a Do classes created by a DDL CREATE TABLE statement define a bitmap extent index
。如果在創建位圖索引后,對自動定義位圖范圍索引的表調用CREATE BITMAPEXTENT INDEX
,則先前定義的位圖范圍索引將重命名為CREATE BITMAPEXTENT INDEX
語句指定的名稱。
有關自動刪除現有位圖范圍索引的DDL
操作,請參閱ALTER TABLE
。
SQL
自動為每個表創建一個RowID
字段,其中包含一個系統生成的整數,作為唯一的記錄id
。 可選的IDENTITY
關鍵字允許定義一個具有與RowID記
錄id
字段相同屬性的命名字段。 IDENTITY
字段作為一個單字段IDKEY
索引,其值是系統生成的唯一整數。
定義標識字段可防止將主鍵定義為IDKEY
。
與任何系統生成的ID字段一樣,IDENTITY
字段具有以下特征:
IDENTITY
字段。 試圖為表定義多個IDENTITY
字段會產生SQLCODE -308
錯誤。IDENTITY
字段的數據類型必須是整數數據類型。 如果不指定數據類型,則將其數據類型自動定義為BIGINT
。 可以指定任何整數數據類型,如integer
或SMALLINT
; 建議使用BIGINT
匹配RowID
的數據類型。 接受任何指定的字段約束,如NOT NULL
或UNIQUE
,但忽略。IDENTITY
字段數據值不能由用戶指定。 默認情況下,insert
語句沒有也不能指定IDENTITY
字段值。 嘗試這樣做會產生SQLCODE -111
錯誤。 要確定是否可以指定IDENTITY
字段值,調用$SYSTEM.SQL.Util.GetOption("IdentityInsert")
方法; 默認值是0
。要更改當前進程的此設置,請調用$SYSTEM.SQL.Util.SetOption()
方法,如下所示:設置status=$SYSTEM.SQL.Util.SetOption(“IdentityInsert”,1,.oldval)
。也可以在表定義中指定%CLASSPARAMETER ALLOWIDENTITYINSERT=1
。指定ALLOWIDENTITYINSERT=1
將覆蓋使用SetOption(“IdentityInsert”)
應用的任何設置。update
語句中修改標識字段數據值。嘗試這樣做會生成SQLCODE-107
錯誤。ODBC
和JDBC
。如果CREATE TABLE
或ALTER TABLE
語句在標識字段或包括標識字段的一組列上定義了主鍵約束或唯一約束,則會忽略約束定義,并且不會創建相應的主鍵或唯一索引定義。select*
語句確實返回表的標識字段。在insert
、update
或delete
操作之后,可以使用LAST_IDENTITY
函數返回最近修改的記錄的標識字段的值。如果未定義標識字段,LAST_IDENTITY
將返回最近修改的記錄的RowID
值。
以下嵌入式SQL程序創建一個具有標識字段的表,然后在表中插入一條記錄,從而生成標識字段值:
/// d ##class(PHA.TEST.SQLCommand).CreateTable5()ClassMethod CreateTable5(){ d $SYSTEM.Security.Login("_SYSTEM","SYS") &sql( CREATE TABLE Employee ( EmpNum INT NOT NULL, MyID IDENTITY NOT NULL, Name char(30) NOT NULL, CONSTRAINT EMPLOYEEPK PRIMARY KEY (EmpNum) ) ) if SQLCODE '= 0 { w !,"創建表錯誤是: ",SQLCODE } else { w !,"表已創建" } &sql( insert INTO Employee ( EmpNum,Name ) select ID,Name FROM SQLUser.Person WHERE Age >= '25' ) if SQLCODE '= 0 { w !,"插入錯誤 error is: ",SQLCODE } else { w !,"插入到表中的記錄" }}
在本例中,主鍵(EmpNum
)取自另一個表的ID字段。因此,EmpNum
值是唯一的整數,但是(因為WHERE
子句)它們的序列中可能包含空格。標識字段myid
為每條記錄分配一個用戶可見的唯一順序整數。
SQL提供三種類型的系統生成的整數計數器字段。這三種數據類型都是擴展%Library.BigInt
數據類型類的子類。
計數器類型 | 計數器范圍 | 自動增加 | 當用戶提供的值為 | 用戶提供的值 | 重復的值 | 類型字段 | 計數器復位 | 分片表支持 |
---|---|---|---|---|---|---|---|---|
AUTO_INCREMENT | per-table | insert | NULL or 0 | 允許,不影響系統計數器 | 允許 | 每個表一個 | 截斷表 | Yes |
SERIAL | per-serial計數器字段 | insert | NULL or 0 | 允許,可增加系統計數器 | Allowed | multiple per table | 截斷表 | No |
ROWVERSION | namespace-wide | insert and update | Not Allowed | Not Allowed | one per table | not reset | No |
下面的CREATE TABLE
示例定義了這些字段:
CREATE TABLE MyStudents ( Name VARCHAR(16) NOT NULL, DOB DATE, AutoInc BIGINT AUTO_INCREMENT, Counter SERIAL, RowVer ROWVERSION )
指定ROWVERSION
和SERIAL
關鍵字,而不是顯式的數據類型。 因此以下是有效的字段定義語法:MySerial SERIAL
或MyRowVer ROWVERSION
。
AUTO_INCREMENT
關鍵字在顯式數據類型之后指定。也可以使用%Library.AutoIncrement
數據類型定義AUTO_INCREMENT
字段。因此,以下是有效的字段定義語法:MyAutoInc %AutoIncrement, MyAutoInc %AutoIncrement AUTO_INCREMENT, or MyAutoInc INTEGER AUTO_INCREMENT
。
定義主鍵是可選的。定義表格時,IRIS會自動創建一個生成的字段,即RowID Field
(默認名稱“ID”
),它的作用是唯一的行標識符。在將每條記錄添加到表中時, IRIS會為該記錄的RowID
字段分配一個唯一的不可修改的正整數??梢杂羞x擇地定義一個主鍵,該主鍵還用作唯一的行標識符。主鍵允許用戶定義對應用程序有意義的行標識符。例如,主鍵可以是員工ID
字段、社會保險號、患者記錄ID字段或庫存庫存編號。
可以使用PRIMARY KEY
子句將一個字段(或一組字段)顯式定義為主記錄標識符。定義主鍵有三種語法形式:
CREATE TABLE MyTable (Field1 INT PRIMARY KEY, Field2 INT)CREATE TABLE MyTable (Field1 INT, Field2 INT, PRIMARY KEY (Field1))CREATE TABLE MyTable (Field1 INT, Field2 INT, CONSTRAINT MyTablePK PRIMARY KEY (Field1))
第一種語法將一個字段定義為主鍵;通過將其指定為主鍵,根據定義,該字段是唯一的,并且不為空。第二和第三種語法可用于單個字段主鍵,但允許包含多個字段的主鍵。例如,主鍵(Field1、Field2
)。如果指定單個字段,則根據定義,此字段是唯一的,并且不為空。如果指定逗號分隔的字段列表,則每個字段都被定義為非NULL
,但只要字段值的組合是唯一值,就可以包含重復值。第三種語法允許顯式地命名主鍵;前兩種語法形式生成一個主鍵名稱,如下所示:表名“PKEY”
約束COUNT INTEGER
。
主鍵只接受唯一值,不接受NULL
。(主鍵索引屬性不會根據需要自動定義;但是,它實際上是必需的,因為不能為主鍵字段歸檔或保存空值。)。主鍵的排序規則類型在字段本身的定義中指定。
默認情況下,主鍵不是唯一的IDKEY
索引。在許多情況下,這樣做更可取,因為它使能夠更新主鍵值、設置主鍵的排序規則類型等。在某些情況下,最好將主鍵定義為IDKEY
索引。請注意,這會對主鍵的未來使用施加IDKEY
限制。
如果向現有字段添加主鍵約束,則該字段還可能自動定義為IDKEY
索引。這取決于數據是否存在,以及通過以下方式之一建立的配置設置:
SQL SET OPTION PKEY_IS_IDKEY
語句。$SYSTEM.SQL.Util.SetOption()
方法配置選項DDLPKeyNotIDKey
。要確定當前設置,請調用$SYSTEM.SQL.CurrentSettings()
,它顯示的是通過DDL而不是ID
鍵創建的主鍵;默認值為1。Primary Key
不會成為類定義中的IDKEY索引。 使用非IDKEY
的主鍵訪問記錄的效率顯著降低; 但是,這種類型的主鍵值是可以修改的。DDL
指定Primary Key
約束時,它將自動成為類定義中的IDKEY
索引。 選擇了這個選項后,數據訪問更加有效,但是主鍵值一旦設置,就永遠不能修改。但是,如果在表中定義了IDENTITY
字段,則不能將主鍵定義為IDKEY
,即使使用了這些配置設置之一來建立將主鍵定義為IDKEY
。
IRIS支持作為IDKEY
索引的一部分的屬性(字段)成為SqlComputed
。 例如,父引用字段。 屬性必須是一個觸發的計算字段。 定義為SqlComputed
的IDKEY
屬性僅在首次保存新Object
或insert
操作時計算。 不支持update
計算,因為作為IDKEY
索引一部分的字段不能被更新。
在大多數情況下,應該顯式定義主鍵。但是,如果未指定主鍵, IRIS將根據以下規則嘗試使用另一個字段作為ODBC/JDBC
投影的主鍵:
IDKEY
索引,則將IDKEY
字段報告為SQLPrimaryKey
字段。SqlRowIdPrivate=0
(默認值)定義類,則將RowID
字段報告為SQLPrimaryKey
字段。IDKEY
索引,則將IDKEY
字段報告為SQLPrimaryKey
字段。SQLPrimaryKey
。只能定義一個主鍵。默認情況下,當主鍵已經存在時, IRIS拒絕定義主鍵的嘗試,或者拒絕定義同一主鍵兩次,并發出SQLCODE-307
錯誤。即使主鍵的第二個定義與第一個定義相同,也會發出SQLCODE-307
錯誤。要確定當前配置,請調用$SYSTEM.SQL.CurrentSettings()
,該函數顯示當鍵存在時允許通過DDL創建主鍵設置。默認值為0
(否),這是建議的配置設置。如果此選項設置為1
(是), IRIS將刪除現有的主鍵約束,并將最后指定的主鍵建立為表的主鍵。
在管理門戶、系統管理、配置、SQL和對象設置中,通過選中忽略冗余DDL語句復選框,可以在系統范圍內設置此選項(以及其他類似的創建、更改和刪除選項)。
例如,下面的CREATE TABLE
語句:
CREATE TABLE MyTable (f1 VARCHAR(16), CONSTRAINT MyTablePK PRIMARY KEY (f1))
創建主鍵(如果不存在)。隨后的ALTER TABLE語句:
ALTER TABLE MyTable ADD CONSTRAINT MyTablePK PRIMARY KEY (f1)
生成SQLCODE-307
錯誤。
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
如何才能得到騰訊QQ公仔?你好!這是微信登錄的活動。您需要在手機上安裝微信應用程序,單擊我的,然后單擊登錄保存金幣。如果金幣夠了,你可以兌換或者畫QQ玩偶。大家還記得馬化騰的拍拍網嗎?大家都知道拍拍網是騰訊的購物網站。然而,即使有騰訊的堅強后盾,與同類淘寶網相比,其銷量也“慘不忍睹”。深圳哪有正版qq公仔買最好是南山或者是福田?不太清楚外面的商店在哪里能賣。我的QQ娃娃是騰訊公司和騰訊內部員工買的...
北京到杭州高鐵里程數?從北京到杭州全程約1200公里。目前北京到杭州沒有直達線路,推薦19條中轉線路,分別是:G177、G197、C2079、G33、G35、G181、G37、G185、G187、C2559、G189、G191、G193、Z284、G133至G7613、G137。222北京到杭州高鐵多少公里,北京到杭州高鐵最新消息?北京到杭州的航班列表類別順序始發站末端的耗費時間的方案1G177細...
whist翻頁筆的使用說明?PPT翻頁激光筆有接收器,插在電腦的USB接口上。一般會有說明,根據安裝直接使用即可。ppt翻頁筆怎么對碼?按住激光筆的翻頁鍵,打開激光筆的開關,將接收器插入電腦的usb接口,指示燈閃爍。松開向下翻頁按鈕,指示燈停止閃爍。如果配對成功,激光筆可以正常使用。ppt用激光筆不能切換怎么處理?激光翻頁筆一般用來直接打開PPT課件演示,功能其實和鼠標點擊差不多。如果在白板軟件中...