當前位置:首頁 » 編程語言 » sql語句設置檢查性約束
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql語句設置檢查性約束

發布時間: 2022-07-21 10:11:08

㈠ 在sql中,一個表中是否能創建多個檢查性約束

[編輯本段]SQL觸發器 觸發器是一種特殊類型的存儲過程,不由用戶直接調用。創建觸發器時會對其進行定義,以便在對特定表或列作特定類型的數據修改時執行。 CREATE PROCEDURE 或 CREATE TRIGGER 語句不能跨越批處理。即存儲過程或觸發器始終只能在一個批處理中創建並編譯到一個執行計劃中。 用觸發器還可以強制執行業務規則 Microsoft? SQL Server? 2000 提供了兩種主要機制來強制業務規則和數據完整性:約束和觸發器。觸發器是一種特殊類型的存儲過程,它在指定的表中的數據發生變化時自動生效。喚醒調用觸發器以響應 INSERT、UPDATE 或 DELETE 語句。觸發器可以查詢其它表,並可以包含復雜的 Transact-SQL 語句。將觸發器和觸發它的語句作為可在觸發器內回滾的單個事務對待。如果檢測到嚴重錯誤(例如,磁碟空間不足),則整個事務即自動回滾。 [編輯本段]優點 觸發器可通過資料庫中的相關表實現級聯更改;不過,通過級聯引用完整性約束可以更有效地執行這些更改。 觸發器可以強制比用 CHECK 約束定義的約束更為復雜的約束。 與 CHECK 約束不同,觸發器可以引用其它表中的列。例如,觸發器可以使用另一個表中的 SELECT 比較插入或更新的數據,以及執行其它操作,如修改數據或顯示用戶定義錯誤信息。 觸發器也可以評估數據修改前後的表狀態,並根據其差異採取對策。 一個表中的多個同類觸發器(INSERT、UPDATE 或 DELETE)允許採取多個不同的對策以響應同一個修改語句。 比較觸發器與約束 約束和觸發器在特殊情況下各有優勢。觸發器的主要好處在於它們可以包含使用 Transact-SQL 代碼的復雜處理邏輯。因此,觸發器可以支持約束的所有功能;但它在所給出的功能上並不總是最好的方法。 實體完整性總應在最低級別上通過索引進行強制,這些索引或是 PRIMARY KEY 和 UNIQUE 約束的一部分,或是在約束之外獨立創建的。假設功能可以滿足應用程序的功能需求,域完整性應通過 CHECK 約束進行強制,而引用完整性 (RI) 則應通過 FOREIGN KEY 約束進行強制。 在約束所支持的功能無法滿足應用程序的功能要求時,觸發器就極為有用。例如: 除非 REFERENCES 子句定義了級聯引用操作,否則 FOREIGN KEY 約束只能以與另一列中的值完全匹配的值來驗證列值。 CHECK 約束只能根據邏輯表達式或同一表中的另一列來驗證列值。如果應用程序要求根據另一個表中的列驗證列值,則必須使用觸發器。 約束只能通過標準的系統錯誤信息傳遞錯誤信息。如果應用程序要求使用(或能從中獲益)自定義信息和較為復雜的錯誤處理,則必須使用觸發器。 觸發器可通過資料庫中的相關表實現級聯更改;不過,通過級聯引用完整性約束可以更有效地執行這些更改。 觸發器可以禁止或回滾違反引用完整性的更改,從而取消所嘗試的數據修改。當更改外鍵且新值與主鍵不匹配時,此類觸發器就可能發生作用。例如,可以在 titleauthor.title_id 上創建一個插入觸發器,使它在新值與 titles.title_id 中的某個值不匹配時回滾一個插入。不過,通常使用 FOREIGN KEY 來達到這個目的。 如果觸發器表上存在約束,則在 INSTEAD OF 觸發器執行後但在 AFTER 觸發器執行前檢查這些約束。如果約束破壞,則回滾 INSTEAD OF 觸發器操作並且不執行 AFTER 觸發器。 [編輯本段]SQL觸發器語法 語法 CREATE TRIGGER trigger_name ON [ WITH ENCRYPTION ] [ WITH APPEND ] [ NOT FOR REPLICATION ] AS [ UPDATE ( column ) ] [ ...n ] | IF ( COLUMNS_UPDATED ( ) updated_bitmask ) column_bitmask [ ...n ] } ] sql_statement [ ...n ] } } 參數 trigger_name 是觸發器的名稱。觸發器名稱必須符合標識符規則,並且在資料庫中必須唯一。可以選擇是否指定觸發器所有者名稱。 Table | view 是在其上執行觸發器的表或視圖,有時稱為觸發器表或觸發器視圖。可以選擇是否指定表或視圖的所有者名稱。 WITH ENCRYPTION 加密 syscomments 表中包含 CREATE TRIGGER 語句文本的條目。使用 WITH ENCRYPTION 可防止將觸發器作為 SQL Server 復制的一部分發布。 AFTER 指定觸發器只有在觸發 SQL 語句中指定的所有操作都已成功執行後才激發。所有的引用級聯操作和約束檢查也必須成功完成後,才能執行此觸發器。 如果僅指定 FOR 關鍵字,則 AFTER 是默認設置。 不能在視圖上定義 AFTER 觸發器。 INSTEAD OF 指定執行觸發器而不是執行觸發 SQL 語句,從而替代觸發語句的操作。 在表或視圖上,每個 INSERT、UPDATE 或 DELETE 語句最多可以定義一個 INSTEAD OF 觸發器。然而,可以在每個具有 INSTEAD OF 觸發器的視圖上定義視圖。 INSTEAD OF 觸發器不能在 WITH CHECK OPTION 的可更新視圖上定義。如果向指定了 WITH CHECK OPTION 選項的可更新視圖添加 INSTEAD OF 觸發器,SQL Server 將產生一個錯誤。用戶必須用 ALTER VIEW 刪除該選項後才能定義 INSTEAD OF 觸發器。 是指定在表或視圖上執行哪些數據修改語句時將激活觸發器的關鍵字。必須至少指定一個選項。在觸發器定義中允許使用以任意順序組合的這些關鍵字。如果指定的選項多於一個,需用逗號分隔這些選項。 對於 INSTEAD OF 觸發器,不允許在具有 ON DELETE 級聯操作引用關系的表上使用 DELETE 選項。同樣,也不允許在具有 ON UPDATE 級聯操作引用關系的表上使用 UPDATE 選項。 WITH APPEND 指定應該添加現有類型的其它觸發器。只有當兼容級別是 65 或更低時,才需要使用該可選子句。如果兼容級別是 70 或更高,則不必使用 WITH APPEND 子句添加現有類型的其它觸發器(這是兼容級別設置為 70 或更高的 CREATE TRIGGER 的默認行為)。有關更多信息,請參見 sp_dbcmptlevel。 WITH APPEND 不能與 INSTEAD OF 觸發器一起使用,或者,如果顯式聲明 AFTER 觸發器,也不能使用該子句。只有當出於向後兼容而指定 FOR 時(沒有 INSTEAD OF 或 AFTER),才能使用 WITH APPEND。以後的版本將不支持 WITH APPEND 和 FOR(將被解釋為 AFTER)。 NOT FOR REPLICATION 表示當復制進程更改觸發器所涉及的表時,不應執行該觸發器。 AS 是觸發器要執行的操作。 sql_statement 是觸發器的條件和操作。觸發器條件指定其它准則,以確定 DELETE、INSERT 或 UPDATE 語句是否導致執行觸發器操作。 當嘗試 DELETE、INSERT 或 UPDATE 操作時,Transact-SQL語句中指定的觸發器操作將生效。 觸發器可以包含任意數量和種類的 Transact-SQL 語句。觸發器旨在根據數據修改語句檢查或更改數據;它不應將數據返回給用戶。觸發器中的 Transact-SQL 語句常常包含控制流語言。CREATE TRIGGER 語句中使用幾個特殊的表: * deleted 和 inserted 是邏輯(概念)表。這些表在結構上類似於定義觸發器的表(也就是在其中嘗試用戶操作的表);這些表用於保存用戶操作可能更改的行的舊值或新值。例如,若要檢索 deleted 表中的所有值,請使用: SELECT * FROM deleted * 如果兼容級別等於 70,那麼在 DELETE、INSERT 或 UPDATE 觸發器中,SQL Server 將不允許引用 inserted 和 deleted 表中的 text、ntext 或 image 列。不能訪問 inserted 和 deleted 表中的 text、ntext 和 image 值。若要在 INSERT 或 UPDATE 觸發器中檢索新值,請將 inserted 表與原始更新表聯接。當兼容級別是 65 或更低時,對 inserted 或 deleted 表中允許空值的text、ntext 或 image 列,將返回空值;如果這些列不可為空,則返回零長度字元串。 當兼容級別是 80 或更高時,SQL Server 允許在表或視圖上通過 INSTEAD OF 觸發器更新 text、ntext 或 image 列。 n 是表示觸發器中可以包含多條 Transact-SQL 語句的佔位符。對於 IF UPDATE (column) 語句,可以通過重復 UPDATE (column) 子句包含多列。 IF UPDATE (column) 測試在指定的列上進行的 INSERT 或 UPDATE 操作,不能用於 DELETE 操作。可以指定多列。因為在 ON 子句中指定了表名,所以在 IF UPDATE 子句中的列名前不要包含表名。若要測試在多個列上進行的 INSERT 或 UPDATE 操作,請在第一個操作後指定單獨的 UPDATE(column) 子句。在 INSERT 操作中 IF UPDATE 將返回 TRUE 值,因為這些列插入了顯式值或隱性 (NULL) 值。 說明 IF UPDATE (column) 子句的功能等同於 IF、IF...ELSE 或 WHILE 語句,並且可以使用 BEGIN...END 語句塊。有關更多信息,請參見控制流語言。 可以在觸發器主體中的任意位置使用 UPDATE (column)。 column 是要測試 INSERT 或 UPDATE 操作的列名。該列可以是 SQL Server 支持的任何數據類型。但是,計算列不能用於該環境中。有關更多信息,請參見數據類型。 IF (COLUMNS_UPDATED()) 測試是否插入或更新了提及的列,僅用於 INSERT 或 UPDATE 觸發器中。COLUMNS_UPDATED 返回 varbinary 位模式,表示插入或更新了表中的哪些列。 COLUMNS_UPDATED 函數以從左到右的順序返回位,最左邊的為最不重要的位。最左邊的位表示表中的第一列;向右的下一位表示第二列,依此類推。如果在表上創建的觸發器包含 8 列以上,則 COLUMNS_UPDATED 返回多個位元組,最左邊的為最不重要的位元組。在 INSERT 操作中 COLUMNS_UPDATED 將對所有列返回 TRUE 值,因為這些列插入了顯式值或隱性 (NULL) 值。 可以在觸發器主體中的任意位置使用 COLUMNS_UPDATED。 bitwise_operator 是用於比較運算的位運算符。 updated_bitmask 是整型位掩碼,表示實際更新或插入的列。例如,表 t1 包含列 C1、C2、C3、C4 和 C5。假定表 t1 上有 UPDATE 觸發器,若要檢查列 C2、C3 和 C4 是否都有更新,指定值 14;若要檢查是否只有列 C2 有更新,指定值 2。 comparison_operator 是比較運算符。使用等號 (=) 檢查 updated_bitmask 中指定的所有列是否都實際進行了更新。使用大於號 (>) 檢查 updated_bitmask 中指定的任一列或某些列是否已更新。 column_bitmask 是要檢查的列的整型位掩碼,用來檢查是否已更新或插入了這些列。 注釋 觸發器常常用於強制業務規則和數據完整性。SQL Server 通過表創建語句(ALTER TABLE 和 CREATE TABLE)提供聲明引用完整性 (DRI);但是 DRI 不提供資料庫間的引用完整性。若要強制引用完整性(有關表的主鍵和外鍵之間關系的規則),請使用主鍵和外鍵約束(ALTER TABLE 和 CREATE TABLE 的 PRIMARY KEY 和 FOREIGN KEY 關鍵字)。如果觸發器表存在約束,則在 INSTEAD OF 觸發器執行之後和 AFTER 觸發器執行之前檢查這些約束。如果違反了約束,則回滾 INSTEAD OF 觸發器操作且不執行(激發)AFTER 觸發器。 可用 sp_settriggerorder 指定表上第一個和最後一個執行的 AFTER 觸發器。在表上只能為每個 INSERT、UPDATE 和 DELETE 操作指定一個第一個執行和一個最後一個執行的 AFTER 觸發器。如果同一表上還有其它 AFTER 觸發器,則這些觸發器將以隨機順序執行。 如果 ALTER TRIGGER 語句更改了第一個或最後一個觸發器,則將除去已修改觸發器上設置的第一個或最後一個特性,而且必須用 sp_settriggerorder 重置排序值。 只有當觸發 SQL 語句(包括所有與更新或刪除的對象關聯的引用級聯操作和約束檢查)成功執行後,AFTER 觸發器才會執行。AFTER 觸發器檢查觸發語句的運行效果,以及所有由觸發語句引起的 UPDATE 和 DELETE 引用級聯操作的效果。 觸發器限制 CREATE TRIGGER 必須是批處理中的第一條語句,並且只能應用到一個表中。 觸發器只能在當前的資料庫中創建,不過觸發器可以引用當前資料庫的外部對象。 如果指定觸發器所有者名稱以限定觸發器,請以相同的方式限定表名。 在同一條 CREATE TRIGGER 語句中,可以為多種用戶操作(如 INSERT 和 UPDATE)定義相同的觸發器操作。 如果一個表的外鍵在 DELETE/UPDATE 操作上定義了級聯,則不能在該表上定義 INSTEAD OF DELETE/UPDATE 觸發器。 在觸發器內可以指定任意的 SET 語句。所選擇的 SET 選項在觸發器執行期間有效,並在觸發器執行完後恢復到以前的設置。 這個也是轉載來的 很不錯哦,你可以試下的 呵呵

㈡ SQL 新建檢查約束

1、檢查約束不支持子查詢,所以你的平均成績放在約束中是實現不了的2、如果只是普通列,給你寫了一個例子CREATE TABLE Test
(TID INT PRIMARY KEY IDENTITY(1,1),
Tname VARCHAR(20),
Grade INT)
GO
ALTER TABLE Test ADD CONSTRAINT ck_cj CHECK(Grade<100)

㈢ SQL server語句所有的約束條件

1、主鍵約束(Primary Key constraint):要求主鍵列數據唯一,並且不允許為空。

2、唯一約束(Unique constraint):要求該列唯一,允許為空,但只能出現一個空值。

3、檢查約束(Check constraint):某列取值范圍限制,格式限制等,如有關年齡、郵箱(必須有@)的約束。

4、默認約束(Default constraint):某列的默認值,如在資料庫里有一項數據很多重復,可以設為默認值。

5、外鍵約束(Foreign Key constraint):用於在兩個表之間建立關系,需要指定引用主表的哪一列。

(3)sql語句設置檢查性約束擴展閱讀:

對於存在外鍵約束的表,如果進行刪除非空的外鍵,可能會出現錯誤。 如果在 FOREIGN KEY 約束的列中輸入非 NULL 值,則此值必須在被引用的列中存在,否則將返回違反外鍵約束的錯誤信息。

列級 FOREIGN KEY 約束的 REFERENCES 子句僅能列出一個引用列,且該列必須與定義約束的列具有相同的數據類型。表級 FOREIGN KEY 約束的 REFERENCES 子句中引用列的數目必須與約束列列表中的列數相同。每個引用列的數據類型也必須與列表中相應列的數據類型相同。

㈣ 用sql語句如何更改 檢查約束

TABLE 是表的名字 [CK_TABLE] 是約束的名字
alter table TABLE drop constraint [CK_TABLE]

alter table TABLE add constraint [CK_TABLE] check([d] in (1,2))

㈤ SQL的檢查約束

用觸發器
CREATE TRIGGER st_table
FOR INSERT,UPDATE
AS
declare @sum float
declare @current_value float
select @sum=sum(col_name) from table
select @current_value =(col_name) from inserted
select @sum=@sum+@current_value
.......
後面自己寫判斷,滿足就INSERT

最好把INSERT,UPDATE 寫成二個觸發器
,否則你用if update(Name)
來判斷
或者
if exist(select * from inserted)
begin
end
if exist(select * from updated)
begin
end

㈥ 用sql語句建表和設置約束

val c = a.par.aggregate(5)(_+_,_+_)
def apply(i: Int): T

同下面代碼,取出指定索引處的元素
val first = numbers(0) // 讀取第一個元素

㈦ 在 SQL server中怎樣設置成績表中成績欄位的檢查約束值為0到100之間

CHECK(成績>=0 AND 成績<=100)