Ⅰ 第五章 sql定義表(一)
可以通過定義表(使用 CREATE TABLE )或通過定義投影到表的持久類來創建表:
由於以下原因,這兩個名字之間的對應關系可能不相同:
表、視圖或存儲過程名稱可以是限定的( schema.name ),也可以是限定的( name )。
模式名遵循標識符約定,需要特別注意非字母數字字元的使用。
模式名不應該指定為帶分隔符的標識符。
嘗試指定「USER」或任何其他SQL保留字作為模式名會導致 SQLCODE -312 錯誤。
INFORMATION_SCHEMA 模式名和相應的信息。
模式包名在所有命名空間中保留。
用戶不應該在這個模式/包中創建表/類。
當執行一個創建操作(比如 create TABLE ),指定一個還不存在的模式時,InterSystems IRIS將創建新的模式。
InterSystems IRIS使用模式名生成相應的包名。
由於模式及其對應包的命名約定不同,用戶應該注意非字母數字字元的名稱轉換注意事項。
這些名稱轉換的注意事項與表不同:
INFORMATION_SCHEMA 模式名和相應的信息。
模式包名在所有命名空間中保留。
用戶不應該在這個模式/包中創建表/類
在所有名稱空間中保留 IRIS_Shard 模式名。
用戶不應在此模式中創建表、視圖或過程。
存儲在 IRIS_Shard 模式中的項不會通過編目查詢或 INFORMATION_SCHEMA 查詢顯示。
初始設置是對所有名稱空間(系統范圍)使用相同的默認模式名。
可以為所有命名空間設置相同的默認模式名,也可以為當前命名空間設置默認模式名。
如果創建了一個具有非限定名稱的表或其他項,InterSystems IRIS將為其分配默認模式名和相應的持久類包名。
如果一個命名的或默認的模式不存在,InterSystems IRIS將創建模式(和包),並將創建的項分配給該模式。
如果刪除模式中的最後一項,InterSystems IRIS將刪除該模式(和包)。
下面的模式名解析描述適用於表名、視圖名和存儲過程名。
系統范圍的初始默認模式名是 SQLUser 。
對應的持久類包名是 User 。
因此,非限定表名 Employee 或限定表名 SQLUser 。
Employee 將生成類 User.Employee 。
因為 USER 是一個保留字,嘗試用 USER 的模式名(或任何SQL保留字)指定限定名會導致 SQLCODE -1 錯誤。
要返回當前默認模式名,請調用 $SYSTEM.SQL.DefaultSchema() 方法:
或者使用以下預處理器宏:
可以使用以下任意一種方式更改默認模式名:
注意:當更改默認的SQL模式名稱時,系統將自動清除系統上所有名稱空間中的所有緩存查詢。
通過更改默認模式名稱,可以更改所有包含非限定表、視圖或存儲過程名稱的查詢的含義。
強烈建議在安裝InterSystems IRIS時建立默認的SQL模式名,以後不要修改。
模式名用於生成相應的類包名。
因為這些名稱有不同的命名約定,所以它們可能不相同。
可以通過將其設置為系統范圍的默認模式來創建與SQL保留字同名的模式,但是不建議這樣做。
名為 User 的默認模式根據類命名唯一性約定,生成相應的類包名稱 User0 。
如果指定 _CURRENT_USER/name 作為默認模式名,其中name是選擇的任意字元串,那麼InterSystems IRIS將當前登錄進程的用戶名分配為默認模式名。
如果進程沒有登錄,則name將用作默認的模式名。
例如,如果進程沒有登錄, _CURRENT_USER/HMO 使用HMO作為默認模式名。
在 $SYSTEM.SQL.SetDefaultSchema() 中,指定 "_CURRENT_USER" 作為帶引號的字元串。
當訪問一個現有的表(或視圖,或存儲過程)進行DML操作時,將從模式搜索路徑中提供一個非限定的名稱。
按照指定的順序搜索模式,並返回第一個匹配項。
如果在搜索路徑中沒有找到匹配的模式,或者沒有搜索路徑,則使用默認的模式名。
(注意, #Import 宏指令使用了不同的搜索策略,不會「失敗」到默認的模式名。)
如果非限定名與模式搜索路徑中指定的任何模式或默認模式名不匹配,則會發出 SQLCODE -30 錯誤,例如: SQLCODE: -30 消息: Table 'PEOPLE' not found in schemas: CUSTOMERS,EMPLOYEES,SQLUSER 。
當創建一個基於odbc的查詢以通過Mac上的Microsoft query從Microsoft Excel運行時,如果從可用的表列表中選擇一個表,則生成的查詢不包括該表的模式(相當於類的包)。
例如,如果選擇從示例模式返回 Person 表的所有行,則生成的查詢為:
因為InterSystems IRIS將不限定的表名解釋為 SQLUser 模式中的表名,所以該語句要麼失敗,要麼從錯誤的表返回數據。
要糾正這一點,編輯查詢(在SQL View選項卡上),顯式引用所需的模式。
然後查詢應該是:
INFORMATION.SCHEMA 。
SCHEMATA persistent 類列出當前名稱空間中的所有模式。
下面的示例返回當前命名空間中的所有非系統模式名:
Management Portal SQL界面的左側允許查看模式(或匹配篩選器模式的多個模式)的內容。
每個表在其模式中都有一個唯一的名稱。
一個表有一個SQL表名和一個對應的持久化類名;
這些名稱在允許的字元、區分大小寫和最大長度方面有所不同。
如果使用SQL CREATE TABLE 命令定義,則指定遵循標識符約定的SQL表名;
系統生成一個對應的持久化類名。
如果定義為持久類定義,則必須指定只包含字母和數字字元的名稱;
這個名稱既用作區分大小寫的持久類名,也用作(默認情況下)對應的不區分大小寫的SQL表名。
可選的 SqlTableName class 關鍵字允許用戶指定不同的SQL表名。
當使用 CREATE TABLE 命令創建表時,InterSystems IRIS使用表名生成相應的持久化類名。
由於表及其對應類的命名約定不同,用戶應該注意非字母數字字元的名稱轉換:
同一個模式中的視圖和表不能具有相同的名稱。
嘗試這樣做會導致 SQLCODE -201 錯誤。
可以使用 $SYSTEM.SQL.TableExists() 方法確定一個表名是否已經存在。
可以使用 $SYSTEM.SQL.ViewExists() 方法確定視圖名是否已經存在。
這些方法還返回與表或視圖名稱對應的類名。
管理門戶SQL interface Catalog Details表信息選項顯示與所選SQL表名稱對應的類名。
試圖指定 「USER」 或任何其他SQL保留字作為表名或模式名會導致 SQLCODE -312 錯誤。
要指定SQL保留字作為表名或模式名,可以指定名稱作為帶分隔符的標識符。
如果使用帶分隔符的標識符指定包含非字母數字字元的表或模式名,InterSystems IRIS將在生成相應的類或包名時刪除這些非字母數字字元。
適用以下表名長度限制:
在SQL中,每條記錄都由一個唯一的整數值標識,這個整數值稱為 RowID 。
在InterSystems SQL中,不需要指定 RowID 欄位。
當創建表並指定所需的數據欄位時,會自動創建RowID欄位。
這個 RowID 在內部使用,但沒有映射到類屬性。
默認情況下,只有當持久化類被投影到SQL表時,它的存在才可見。
在這個投影表中,將出現一個額外的 RowID 欄位。
默認情況下,這個欄位被命名為 「ID」 ,並分配給第1列。
默認情況下,當在表中填充數據時,InterSystems IRIS將從1開始向該欄位分配連續的正整數。 RowID 數據類型為 BIGINT(%Library.BigInt) 。為 RowID 生成的值具有以下約束:每個值都是唯一的。不允許使用 NULL 值。排序規則是精確的。 默認情況下,值不可修改。
默認情況下,InterSystems IRIS將此欄位命名為 「 ID」 。但是,此欄位名稱不是保留的。每次編譯表時都會重新建立 RowID 欄位名。如果用戶定義了一個名為 「 ID」 的欄位,則在編譯表時,InterSystems IRIS會將 RowID 命名為 「 ID1」 。例如,如果用戶隨後使用 ALTER TABLE 定義了一個名為 「 ID1」 的欄位,則表編譯會將 RowID 重命名為 「 ID2」 ,依此類推。在持久性類定義中,可以使用 SqlRowIdName 類關鍵字直接為此類投影到的表指定 RowID 欄位名。由於這些原因,應避免按名稱引用 RowID 欄位。
InterSystems SQL提供了 %ID 偽列名稱(別名),無論分配給 RowID 的欄位名稱如何,該偽列名稱始終返回 RowID 值。 (InterSystems TSQL提供了 $IDENTITY 偽列名稱,其作用相同。)
ALTER TABLE 無法修改或刪除 RowID 欄位定義。
將記錄插入表中後,InterSystems IRIS將為每個記錄分配一個整數ID值。 RowID 值始終遞增。它們不被重用。因此,如果已插入和刪除記錄,則 RowID 值將按升序排列,但可能不連續。
可以通過設置 SetDDLUseSequence() 方法,將InterSystems IRIS配置為使用 $INCREMENT 執行 ID 分配。若要確定當前設置,請調用 $ SYSTEM.SQL.CurrentSettings() 方法。
在持久性類定義中, IdLocation 存儲關鍵字global(例如,對於持久性類 Sample.Person:<IdLocation> ^ Sample.PersonD </ IdLocation> )包含RowID計數器的最高分配值。 (這是分配給記錄的最高整數,而不是分配給進程的最高整數。)請注意,此RowID計數器值可能不再與現有記錄相對應。要確定是否存在具有特定RowID值的記錄,請調用表的 %ExistsId() 方法。
通過 TRUNCATE TABLE 命令重置 RowID 計數器。即使使用 DELETE 命令刪除表中的所有行,也不會通過 DELETE 命令將其重置。如果沒有數據插入表中,或者已使用 TRUNCATE TABLE 刪除所有表數據,則 IdLocation 存儲關鍵字全局值未定義。
默認情況下, RowID 值不可用戶修改。嘗試修改 RowID 值會產生 SQLCODE -107 錯誤。覆蓋此默認值以允許修改 RowID 值可能會導致嚴重的後果,只有在非常特殊的情況下並應格外謹慎。 Config.SQL.AllowRowIDUpdate 屬性允許 RowID 值是用戶可修改的。
通過定義一個用於投影表的持久類,可以定義 RowID 以具有欄位或欄位組合中的值。為此,請使用 IdKey index 關鍵字指定一個索引。例如,一個表可以具有一個 RowID ,其 RowId 通過在 PatientName [IdKey] 上指定索引定義 IdxId 來與 PatientName 欄位的值相同;或者可以通過指定索引定義 IdxId 來將 PatientName 和 SSN 欄位的組合值在 (PatientName,SSN)[IdKey]; 上。
當 RowID 基於多個欄位時, RowID 值是由 || 連接的每個組成欄位的值。操作員。例如, Ross,Betsy || 123-45-6789 。 InterSystems IRIS嘗試確定基於多個欄位的 RowID 的最大長度。如果無法確定最大長度,則 RowID 長度默認為512。
用作外鍵引用的 RowID 必須是公共的。
默認情況下,不能將具有公共 RowID 的表用作源表或目標表,以使用 INSERT INTO Sample.DupTable SELECT * FROM Sample.SrcTable 將數據復制到重復表中。
可以使用Management Portal SQL界面「目錄詳細信息欄位」列出「隱藏」列來顯示 RowID 是否被隱藏。
可以使用以下程序返回指定欄位(在此示例中為 ID )是否被隱藏:
Ⅱ SQL有一張表叫name,表中有個隱藏欄位openhost,select語句查不到,如何能查詢隱藏欄位openhost的記錄
設置為隱藏欄位的內容 是不能查詢也 通過alter table 修改顯示,智能通過 alter table drop column來釋放該欄位。
Ⅲ 怎樣隱藏SQL Server某個欄位的內容
二進制是那些內容被隱藏是因為他放在別的頁面上了,不是真的隱藏。
Ⅳ 怎樣隱藏SQL Server某個欄位的內容
表中沒有數據的話可以導出表結構的sql語法,修改好欄位屬性後,重新再建立那個表!
如果有數據的話,可以在查詢分析器中修改方法:(用sql語句)
alter
table
表名
alter
column
列名
數據類型
Ⅳ sql 查詢,100多個欄位,查詢時怎麼去掉某個不需要的欄位
這個確實比較麻煩。
如果你已知不要的欄位較少,可以通過查詢 syscolumns 表,然後拼動態SQL語句。
Ⅵ SQL中如何隱藏select輸出的已有列
直接在 order 語句中,指定排序對象即可,可以不輸出顯示的。
Ⅶ Mysql中sql查詢如何隱藏分組項的欄位名,只輸出其值
1.選擇查詢 選擇查詢是最常見的查詢類型,它從一個或多個表中檢索數據,在一定的限制條件下,還可以通過選擇查詢來更改相關表中的記錄。
2.交叉表查詢 交叉表查詢可以在一種緊湊的、類似於電子表格的格式中,顯示來源於表中某個欄位的...
3.參數查詢 參數查詢會在執行時彈出對話框,提示用戶輸入必要的信息(參數),然後按照這些信息...
4.操作查詢 操作查詢是在一個操作中更改許多記錄的查詢,操作查詢又可分為四種類型:刪除查詢...
Ⅷ 怎樣刪除SQL表中欄位內容中的隱藏特殊字元
用更新語句,把需要剔除的字元用正則表達式匹配出來替換掉
Ⅸ 隱藏或者禁止查詢某一條記錄用sql語句怎麼寫
where 欄位 not in (select 欄位 from xx )