91嫩草国产线免费观看_欧美日韩中文字幕在线观看_精品精品国产高清a毛片_六月婷婷网 - 一级一级特黄女人精品毛片

SQL 如何給一個表中的一個列中添加多個約束(一個主鍵約束,一個檢查約束),怎么寫

首頁 > 身份戶籍2021-01-24 23:30:51

如何在數據庫表中添加多個主鍵約束

1.(SQL 方式) ALTER TABLE 表名 ADD CONSTRAINT 主鍵名 PRIMARY KEY (以","分隔的屬性列表)
2.(操作方式) 在表設計器中選中兩個字段再設為主鍵.
一個表只能有一個主鍵,該主鍵可以由一個字段組成,也可以由多個字段組成,多個字段組成的稱為聯合主鍵。
為什么要多個主鍵?
你的目的是要同字段中的數據唯一不重復的話, 可以所有 唯一約束.
聯合主鍵
主鍵是數據庫表的一個重要屬性,建立主鍵可以避免表中存在完全相同的記錄,也就是說主鍵在一張表中的記錄值是唯一的。

在sql中,為一個表添加3個檢查約束?

表名是cruise:duration>0,price>0,airfare=x27Yx27orx27Nx27rn怎么寫sql語句或在企業管理器中約束表達式
select * from cruise where duration>0 && price>0 && (airfare='Y' || airfare='N')

SQL 中一個列可以有多個約束,怎么理解,舉個列子

比如創建一個學生表(sid ,name)name 字段有 not null ,unique
兩個約束
表的主鍵、外鍵都算約束,一個表可以同時有有主鍵和外鍵。

SQL 同一張表中幾個字段間的約束怎么實現?

在SQL Server 2000 中,有一張表叫作A表,其中的字段有ID,Name(商品名),price(單價),Num(數量),TotalPrice(金額)。我想加一個約束:金額=單價×數量,不管是插入記錄還是修改字段都要受到此約束的影響,請問怎么實現?請給出具體代碼或者詳細步驟。
下面的語句就可實現你要的功能:

alter table a
with check add check not for replication
(totalprice=price*num)

with check 表示對已存在的數據進行新增的約束檢查(就是表中已存在的數據)
add check 表示在表中增加約束
not for replication 表示復制數據時,不檢查約束;
也就是當你從其他的表中復制到該表中時,不檢查.
(totalprice=price*num) 表示約束條件
只要是約束有效,當插入記錄還是修改字段都要受到此約束的影響.
所以你的理解是錯誤的.

你補充的問題:
兩個表之間的約束只有通過外鍵約束實現;所以當我剛看到你的問題后也是眼前
一亮,我想了很久,也許是我能力不夠,沒法實現;只能:
保留a表中的totalprice列,定義上面的約束;
在b表中,update b set b.totalprice=a.totalprice from a where b.b_id=a.id --將通過a表約束的totalprice列的值挪過到b表中來.
也許還會有其他的方法或則是間接的方法能實現!努力中!
你用trigger吧,在插入前金額這一列的值等于單價×數量。
很方便的,如何創建trigger你自己找點資料

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

可以啊,這個有沒有限制。比如學生表中年齡不能大150,性別只能是男和女等等,都可以的。
可以的空
stuSex nvarchar(5) ,--性別
stuAge int --年齡
)
go
========為表添加約束=========
alter table student add
constrain PK_stuNo primary key (stuNo),--主鍵約束
constrain CK_stuSex check(stuSex='男'or stuSex='女'),--選擇約束
constraint UQ_stuNo unique(stuNo) ,--唯一約束
constraint DF_stuAge default 18 for stuAge --默認為18歲
[編輯本段]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 選項在觸發器執行期間有效,并在觸發器執行完后恢復到以前的設置。這個也是轉載來的 很不錯哦,你可以試下的 呵呵

相關推薦:

電子合同糾紛解決(簽電子合同糾紛怎么解決)

現戶籍所在地怎么填寫(戶籍所在地怎么填寫)

超生新生兒如何上戶(超生如何給孩子上戶口)

行政處罰會留案底嗎(行政處罰決定書會留案底嗎)

公民如何保護生命健康權(法律如何保護我們的健康)