如何在數(shù)據(jù)庫(kù)表中添加多個(gè)主鍵約束
1.(SQL 方式) ALTER TABLE 表名 ADD CONSTRAINT 主鍵名 PRIMARY KEY (以","分隔的屬性列表)
2.(操作方式) 在表設(shè)計(jì)器中選中兩個(gè)字段再設(shè)為主鍵.
一個(gè)表只能有一個(gè)主鍵,該主鍵可以由一個(gè)字段組成,也可以由多個(gè)字段組成,多個(gè)字段組成的稱(chēng)為聯(lián)合主鍵。
為什么要多個(gè)主鍵?
你的目的是要同字段中的數(shù)據(jù)唯一不重復(fù)的話, 可以所有 唯一約束.
聯(lián)合主鍵
主鍵是數(shù)據(jù)庫(kù)表的一個(gè)重要屬性,建立主鍵可以避免表中存在完全相同的記錄,也就是說(shuō)主鍵在一張表中的記錄值是唯一的。
在sql中,為一個(gè)表添加3個(gè)檢查約束?
表名是cruise:duration>0,price>0,airfare=x27Yx27orx27Nx27rn怎么寫(xiě)sql語(yǔ)句或在企業(yè)管理器中約束表達(dá)式select * from cruise where duration>0 && price>0 && (airfare='Y' || airfare='N')
SQL 中一個(gè)列可以有多個(gè)約束,怎么理解,舉個(gè)列子
比如創(chuàng)建一個(gè)學(xué)生表(sid ,name)name 字段有 not null ,unique
兩個(gè)約束
表的主鍵、外鍵都算約束,一個(gè)表可以同時(shí)有有主鍵和外鍵。
SQL 同一張表中幾個(gè)字段間的約束怎么實(shí)現(xiàn)?
在SQL Server 2000 中,有一張表叫作A表,其中的字段有ID,Name(商品名),price(單價(jià)),Num(數(shù)量),TotalPrice(金額)。我想加一個(gè)約束:金額=單價(jià)×數(shù)量,不管是插入記錄還是修改字段都要受到此約束的影響,請(qǐng)問(wèn)怎么實(shí)現(xiàn)?請(qǐng)給出具體代碼或者詳細(xì)步驟。下面的語(yǔ)句就可實(shí)現(xiàn)你要的功能:
alter table a
with check add check not for replication
(totalprice=price*num)
with check 表示對(duì)已存在的數(shù)據(jù)進(jìn)行新增的約束檢查(就是表中已存在的數(shù)據(jù))
add check 表示在表中增加約束
not for replication 表示復(fù)制數(shù)據(jù)時(shí),不檢查約束;
也就是當(dāng)你從其他的表中復(fù)制到該表中時(shí),不檢查.
(totalprice=price*num) 表示約束條件
只要是約束有效,當(dāng)插入記錄還是修改字段都要受到此約束的影響.
所以你的理解是錯(cuò)誤的.
你補(bǔ)充的問(wèn)題:
兩個(gè)表之間的約束只有通過(guò)外鍵約束實(shí)現(xiàn);所以當(dāng)我剛看到你的問(wèn)題后也是眼前
一亮,我想了很久,也許是我能力不夠,沒(méi)法實(shí)現(xiàn);只能:
保留a表中的totalprice列,定義上面的約束;
在b表中,update b set b.totalprice=a.totalprice from a where b.b_id=a.id --將通過(guò)a表約束的totalprice列的值挪過(guò)到b表中來(lái).
也許還會(huì)有其他的方法或則是間接的方法能實(shí)現(xiàn)!努力中!
你用trigger吧,在插入前金額這一列的值等于單價(jià)×數(shù)量。
很方便的,如何創(chuàng)建trigger你自己找點(diǎn)資料
在SQL中,一個(gè)表中是否能創(chuàng)建多個(gè)檢查性約束
可以啊,這個(gè)有沒(méi)有限制。比如學(xué)生表中年齡不能大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 --默認(rèn)為18歲
[編輯本段]SQL觸發(fā)器 觸發(fā)器是一種特殊類(lèi)型的存儲(chǔ)過(guò)程,不由用戶直接調(diào)用。創(chuàng)建觸發(fā)器時(shí)會(huì)對(duì)其進(jìn)行定義,以便在對(duì)特定表或列作特定類(lèi)型的數(shù)據(jù)修改時(shí)執(zhí)行。 CREATE PROCEDURE 或 CREATE TRIGGER 語(yǔ)句不能跨越批處理。即存儲(chǔ)過(guò)程或觸發(fā)器始終只能在一個(gè)批處理中創(chuàng)建并編譯到一個(gè)執(zhí)行計(jì)劃中。 用觸發(fā)器還可以強(qiáng)制執(zhí)行業(yè)務(wù)規(guī)則 Microsoft? SQL Server? 2000 提供了兩種主要機(jī)制來(lái)強(qiáng)制業(yè)務(wù)規(guī)則和數(shù)據(jù)完整性:約束和觸發(fā)器。觸發(fā)器是一種特殊類(lèi)型的存儲(chǔ)過(guò)程,它在指定的表中的數(shù)據(jù)發(fā)生變化時(shí)自動(dòng)生效。喚醒調(diào)用觸發(fā)器以響應(yīng) INSERT、UPDATE 或 DELETE 語(yǔ)句。觸發(fā)器可以查詢其它表,并可以包含復(fù)雜的 Transact-SQL 語(yǔ)句。將觸發(fā)器和觸發(fā)它的語(yǔ)句作為可在觸發(fā)器內(nèi)回滾的單個(gè)事務(wù)對(duì)待。如果檢測(cè)到嚴(yán)重錯(cuò)誤(例如,磁盤(pán)空間不足),則整個(gè)事務(wù)即自動(dòng)回滾。 [編輯本段]優(yōu)點(diǎn) 觸發(fā)器可通過(guò)數(shù)據(jù)庫(kù)中的相關(guān)表實(shí)現(xiàn)級(jí)聯(lián)更改;不過(guò),通過(guò)級(jí)聯(lián)引用完整性約束可以更有效地執(zhí)行這些更改。 觸發(fā)器可以強(qiáng)制比用 CHECK 約束定義的約束更為復(fù)雜的約束。 與 CHECK 約束不同,觸發(fā)器可以引用其它表中的列。例如,觸發(fā)器可以使用另一個(gè)表中的 SELECT 比較插入或更新的數(shù)據(jù),以及執(zhí)行其它操作,如修改數(shù)據(jù)或顯示用戶定義錯(cuò)誤信息。 觸發(fā)器也可以評(píng)估數(shù)據(jù)修改前后的表狀態(tài),并根據(jù)其差異采取對(duì)策。 一個(gè)表中的多個(gè)同類(lèi)觸發(fā)器(INSERT、UPDATE 或 DELETE)允許采取多個(gè)不同的對(duì)策以響應(yīng)同一個(gè)修改語(yǔ)句。 比較觸發(fā)器與約束 約束和觸發(fā)器在特殊情況下各有優(yōu)勢(shì)。觸發(fā)器的主要好處在于它們可以包含使用 Transact-SQL 代碼的復(fù)雜處理邏輯。因此,觸發(fā)器可以支持約束的所有功能;但它在所給出的功能上并不總是最好的方法。 實(shí)體完整性總應(yīng)在最低級(jí)別上通過(guò)索引進(jìn)行強(qiáng)制,這些索引或是 PRIMARY KEY 和 UNIQUE 約束的一部分,或是在約束之外獨(dú)立創(chuàng)建的。假設(shè)功能可以滿足應(yīng)用程序的功能需求,域完整性應(yīng)通過(guò) CHECK 約束進(jìn)行強(qiáng)制,而引用完整性 (RI) 則應(yīng)通過(guò) FOREIGN KEY 約束進(jìn)行強(qiáng)制。 在約束所支持的功能無(wú)法滿足應(yīng)用程序的功能要求時(shí),觸發(fā)器就極為有用。例如: 除非 REFERENCES 子句定義了級(jí)聯(lián)引用操作,否則 FOREIGN KEY 約束只能以與另一列中的值完全匹配的值來(lái)驗(yàn)證列值。 CHECK 約束只能根據(jù)邏輯表達(dá)式或同一表中的另一列來(lái)驗(yàn)證列值。如果應(yīng)用程序要求根據(jù)另一個(gè)表中的列驗(yàn)證列值,則必須使用觸發(fā)器。 約束只能通過(guò)標(biāo)準(zhǔn)的系統(tǒng)錯(cuò)誤信息傳遞錯(cuò)誤信息。如果應(yīng)用程序要求使用(或能從中獲益)自定義信息和較為復(fù)雜的錯(cuò)誤處理,則必須使用觸發(fā)器。 觸發(fā)器可通過(guò)數(shù)據(jù)庫(kù)中的相關(guān)表實(shí)現(xiàn)級(jí)聯(lián)更改;不過(guò),通過(guò)級(jí)聯(lián)引用完整性約束可以更有效地執(zhí)行這些更改。 觸發(fā)器可以禁止或回滾違反引用完整性的更改,從而取消所嘗試的數(shù)據(jù)修改。當(dāng)更改外鍵且新值與主鍵不匹配時(shí),此類(lèi)觸發(fā)器就可能發(fā)生作用。例如,可以在 titleauthor.title_id 上創(chuàng)建一個(gè)插入觸發(fā)器,使它在新值與 titles.title_id 中的某個(gè)值不匹配時(shí)回滾一個(gè)插入。不過(guò),通常使用 FOREIGN KEY 來(lái)達(dá)到這個(gè)目的。 如果觸發(fā)器表上存在約束,則在 INSTEAD OF 觸發(fā)器執(zhí)行后但在 AFTER 觸發(fā)器執(zhí)行前檢查這些約束。如果約束破壞,則回滾 INSTEAD OF 觸發(fā)器操作并且不執(zhí)行 AFTER 觸發(fā)器。 [編輯本段]SQL觸發(fā)器語(yǔ)法 語(yǔ)法 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 ] } } 參數(shù) trigger_name 是觸發(fā)器的名稱(chēng)。觸發(fā)器名稱(chēng)必須符合標(biāo)識(shí)符規(guī)則,并且在數(shù)據(jù)庫(kù)中必須唯一。可以選擇是否指定觸發(fā)器所有者名稱(chēng)。 Table | view 是在其上執(zhí)行觸發(fā)器的表或視圖,有時(shí)稱(chēng)為觸發(fā)器表或觸發(fā)器視圖。可以選擇是否指定表或視圖的所有者名稱(chēng)。 WITH ENCRYPTION 加密 syscomments 表中包含 CREATE TRIGGER 語(yǔ)句文本的條目。使用 WITH ENCRYPTION 可防止將觸發(fā)器作為 SQL Server 復(fù)制的一部分發(fā)布。 AFTER 指定觸發(fā)器只有在觸發(fā) SQL 語(yǔ)句中指定的所有操作都已成功執(zhí)行后才激發(fā)。所有的引用級(jí)聯(lián)操作和約束檢查也必須成功完成后,才能執(zhí)行此觸發(fā)器。 如果僅指定 FOR 關(guān)鍵字,則 AFTER 是默認(rèn)設(shè)置。 不能在視圖上定義 AFTER 觸發(fā)器。 INSTEAD OF 指定執(zhí)行觸發(fā)器而不是執(zhí)行觸發(fā) SQL 語(yǔ)句,從而替代觸發(fā)語(yǔ)句的操作。 在表或視圖上,每個(gè) INSERT、UPDATE 或 DELETE 語(yǔ)句最多可以定義一個(gè) INSTEAD OF 觸發(fā)器。然而,可以在每個(gè)具有 INSTEAD OF 觸發(fā)器的視圖上定義視圖。 INSTEAD OF 觸發(fā)器不能在 WITH CHECK OPTION 的可更新視圖上定義。如果向指定了 WITH CHECK OPTION 選項(xiàng)的可更新視圖添加 INSTEAD OF 觸發(fā)器,SQL Server 將產(chǎn)生一個(gè)錯(cuò)誤。用戶必須用 ALTER VIEW 刪除該選項(xiàng)后才能定義 INSTEAD OF 觸發(fā)器。 是指定在表或視圖上執(zhí)行哪些數(shù)據(jù)修改語(yǔ)句時(shí)將激活觸發(fā)器的關(guān)鍵字。必須至少指定一個(gè)選項(xiàng)。在觸發(fā)器定義中允許使用以任意順序組合的這些關(guān)鍵字。如果指定的選項(xiàng)多于一個(gè),需用逗號(hào)分隔這些選項(xiàng)。 對(duì)于 INSTEAD OF 觸發(fā)器,不允許在具有 ON DELETE 級(jí)聯(lián)操作引用關(guān)系的表上使用 DELETE 選項(xiàng)。同樣,也不允許在具有 ON UPDATE 級(jí)聯(lián)操作引用關(guān)系的表上使用 UPDATE 選項(xiàng)。 WITH APPEND 指定應(yīng)該添加現(xiàn)有類(lèi)型的其它觸發(fā)器。只有當(dāng)兼容級(jí)別是 65 或更低時(shí),才需要使用該可選子句。如果兼容級(jí)別是 70 或更高,則不必使用 WITH APPEND 子句添加現(xiàn)有類(lèi)型的其它觸發(fā)器(這是兼容級(jí)別設(shè)置為 70 或更高的 CREATE TRIGGER 的默認(rèn)行為)。有關(guān)更多信息,請(qǐng)參見(jiàn) sp_dbcmptlevel。 WITH APPEND 不能與 INSTEAD OF 觸發(fā)器一起使用,或者,如果顯式聲明 AFTER 觸發(fā)器,也不能使用該子句。只有當(dāng)出于向后兼容而指定 FOR 時(shí)(沒(méi)有 INSTEAD OF 或 AFTER),才能使用 WITH APPEND。以后的版本將不支持 WITH APPEND 和 FOR(將被解釋為 AFTER)。 NOT FOR REPLICATION 表示當(dāng)復(fù)制進(jìn)程更改觸發(fā)器所涉及的表時(shí),不應(yīng)執(zhí)行該觸發(fā)器。 AS 是觸發(fā)器要執(zhí)行的操作。 sql_statement 是觸發(fā)器的條件和操作。觸發(fā)器條件指定其它準(zhǔn)則,以確定 DELETE、INSERT 或 UPDATE 語(yǔ)句是否導(dǎo)致執(zhí)行觸發(fā)器操作。 當(dāng)嘗試 DELETE、INSERT 或 UPDATE 操作時(shí),Transact-SQL語(yǔ)句中指定的觸發(fā)器操作將生效。 觸發(fā)器可以包含任意數(shù)量和種類(lèi)的 Transact-SQL 語(yǔ)句。觸發(fā)器旨在根據(jù)數(shù)據(jù)修改語(yǔ)句檢查或更改數(shù)據(jù);它不應(yīng)將數(shù)據(jù)返回給用戶。觸發(fā)器中的 Transact-SQL 語(yǔ)句常常包含控制流語(yǔ)言。CREATE TRIGGER 語(yǔ)句中使用幾個(gè)特殊的表: * deleted 和 inserted 是邏輯(概念)表。這些表在結(jié)構(gòu)上類(lèi)似于定義觸發(fā)器的表(也就是在其中嘗試用戶操作的表);這些表用于保存用戶操作可能更改的行的舊值或新值。例如,若要檢索 deleted 表中的所有值,請(qǐng)使用: SELECT * FROM deleted * 如果兼容級(jí)別等于 70,那么在 DELETE、INSERT 或 UPDATE 觸發(fā)器中,SQL Server 將不允許引用 inserted 和 deleted 表中的 text、ntext 或 image 列。不能訪問(wèn) inserted 和 deleted 表中的 text、ntext 和 image 值。若要在 INSERT 或 UPDATE 觸發(fā)器中檢索新值,請(qǐng)將 inserted 表與原始更新表聯(lián)接。當(dāng)兼容級(jí)別是 65 或更低時(shí),對(duì) inserted 或 deleted 表中允許空值的text、ntext 或 image 列,將返回空值;如果這些列不可為空,則返回零長(zhǎng)度字符串。 當(dāng)兼容級(jí)別是 80 或更高時(shí),SQL Server 允許在表或視圖上通過(guò) INSTEAD OF 觸發(fā)器更新 text、ntext 或 image 列。 n 是表示觸發(fā)器中可以包含多條 Transact-SQL 語(yǔ)句的占位符。對(duì)于 IF UPDATE (column) 語(yǔ)句,可以通過(guò)重復(fù) UPDATE (column) 子句包含多列。 IF UPDATE (column) 測(cè)試在指定的列上進(jìn)行的 INSERT 或 UPDATE 操作,不能用于 DELETE 操作。可以指定多列。因?yàn)樵?ON 子句中指定了表名,所以在 IF UPDATE 子句中的列名前不要包含表名。若要測(cè)試在多個(gè)列上進(jìn)行的 INSERT 或 UPDATE 操作,請(qǐng)?jiān)诘谝粋€(gè)操作后指定單獨(dú)的 UPDATE(column) 子句。在 INSERT 操作中 IF UPDATE 將返回 TRUE 值,因?yàn)檫@些列插入了顯式值或隱性 (NULL) 值。 說(shuō)明 IF UPDATE (column) 子句的功能等同于 IF、IF...ELSE 或 WHILE 語(yǔ)句,并且可以使用 BEGIN...END 語(yǔ)句塊。有關(guān)更多信息,請(qǐng)參見(jiàn)控制流語(yǔ)言。 可以在觸發(fā)器主體中的任意位置使用 UPDATE (column)。 column 是要測(cè)試 INSERT 或 UPDATE 操作的列名。該列可以是 SQL Server 支持的任何數(shù)據(jù)類(lèi)型。但是,計(jì)算列不能用于該環(huán)境中。有關(guān)更多信息,請(qǐng)參見(jiàn)數(shù)據(jù)類(lèi)型。 IF (COLUMNS_UPDATED()) 測(cè)試是否插入或更新了提及的列,僅用于 INSERT 或 UPDATE 觸發(fā)器中。COLUMNS_UPDATED 返回 varbinary 位模式,表示插入或更新了表中的哪些列。 COLUMNS_UPDATED 函數(shù)以從左到右的順序返回位,最左邊的為最不重要的位。最左邊的位表示表中的第一列;向右的下一位表示第二列,依此類(lèi)推。如果在表上創(chuàng)建的觸發(fā)器包含 8 列以上,則 COLUMNS_UPDATED 返回多個(gè)字節(jié),最左邊的為最不重要的字節(jié)。在 INSERT 操作中 COLUMNS_UPDATED 將對(duì)所有列返回 TRUE 值,因?yàn)檫@些列插入了顯式值或隱性 (NULL) 值。 可以在觸發(fā)器主體中的任意位置使用 COLUMNS_UPDATED。 bitwise_operator 是用于比較運(yùn)算的位運(yùn)算符。 updated_bitmask 是整型位掩碼,表示實(shí)際更新或插入的列。例如,表 t1 包含列 C1、C2、C3、C4 和 C5。假定表 t1 上有 UPDATE 觸發(fā)器,若要檢查列 C2、C3 和 C4 是否都有更新,指定值 14;若要檢查是否只有列 C2 有更新,指定值 2。 comparison_operator 是比較運(yùn)算符。使用等號(hào) (=) 檢查 updated_bitmask 中指定的所有列是否都實(shí)際進(jìn)行了更新。使用大于號(hào) (>) 檢查 updated_bitmask 中指定的任一列或某些列是否已更新。 column_bitmask 是要檢查的列的整型位掩碼,用來(lái)檢查是否已更新或插入了這些列。 注釋 觸發(fā)器常常用于強(qiáng)制業(yè)務(wù)規(guī)則和數(shù)據(jù)完整性。SQL Server 通過(guò)表創(chuàng)建語(yǔ)句(ALTER TABLE 和 CREATE TABLE)提供聲明引用完整性 (DRI);但是 DRI 不提供數(shù)據(jù)庫(kù)間的引用完整性。若要強(qiáng)制引用完整性(有關(guān)表的主鍵和外鍵之間關(guān)系的規(guī)則),請(qǐng)使用主鍵和外鍵約束(ALTER TABLE 和 CREATE TABLE 的 PRIMARY KEY 和 FOREIGN KEY 關(guān)鍵字)。如果觸發(fā)器表存在約束,則在 INSTEAD OF 觸發(fā)器執(zhí)行之后和 AFTER 觸發(fā)器執(zhí)行之前檢查這些約束。如果違反了約束,則回滾 INSTEAD OF 觸發(fā)器操作且不執(zhí)行(激發(fā))AFTER 觸發(fā)器。 可用 sp_settriggerorder 指定表上第一個(gè)和最后一個(gè)執(zhí)行的 AFTER 觸發(fā)器。在表上只能為每個(gè) INSERT、UPDATE 和 DELETE 操作指定一個(gè)第一個(gè)執(zhí)行和一個(gè)最后一個(gè)執(zhí)行的 AFTER 觸發(fā)器。如果同一表上還有其它 AFTER 觸發(fā)器,則這些觸發(fā)器將以隨機(jī)順序執(zhí)行。 如果 ALTER TRIGGER 語(yǔ)句更改了第一個(gè)或最后一個(gè)觸發(fā)器,則將除去已修改觸發(fā)器上設(shè)置的第一個(gè)或最后一個(gè)特性,而且必須用 sp_settriggerorder 重置排序值。 只有當(dāng)觸發(fā) SQL 語(yǔ)句(包括所有與更新或刪除的對(duì)象關(guān)聯(lián)的引用級(jí)聯(lián)操作和約束檢查)成功執(zhí)行后,AFTER 觸發(fā)器才會(huì)執(zhí)行。AFTER 觸發(fā)器檢查觸發(fā)語(yǔ)句的運(yùn)行效果,以及所有由觸發(fā)語(yǔ)句引起的 UPDATE 和 DELETE 引用級(jí)聯(lián)操作的效果。 觸發(fā)器限制 CREATE TRIGGER 必須是批處理中的第一條語(yǔ)句,并且只能應(yīng)用到一個(gè)表中。 觸發(fā)器只能在當(dāng)前的數(shù)據(jù)庫(kù)中創(chuàng)建,不過(guò)觸發(fā)器可以引用當(dāng)前數(shù)據(jù)庫(kù)的外部對(duì)象。 如果指定觸發(fā)器所有者名稱(chēng)以限定觸發(fā)器,請(qǐng)以相同的方式限定表名。 在同一條 CREATE TRIGGER 語(yǔ)句中,可以為多種用戶操作(如 INSERT 和 UPDATE)定義相同的觸發(fā)器操作。 如果一個(gè)表的外鍵在 DELETE/UPDATE 操作上定義了級(jí)聯(lián),則不能在該表上定義 INSTEAD OF DELETE/UPDATE 觸發(fā)器。 在觸發(fā)器內(nèi)可以指定任意的 SET 語(yǔ)句。所選擇的 SET 選項(xiàng)在觸發(fā)器執(zhí)行期間有效,并在觸發(fā)器執(zhí)行完后恢復(fù)到以前的設(shè)置。這個(gè)也是轉(zhuǎn)載來(lái)的 很不錯(cuò)哦,你可以試下的 呵呵
相關(guān)推薦:
人口普查能上戶口嗎(人口普查可以給孩子上戶口嗎)
身份證遺失如何辦理(公民身份證遺失如何補(bǔ)辦)
網(wǎng)貸逾期怎么處罰(網(wǎng)貸逾期會(huì)怎么樣會(huì)受到什么處罰)
離婚后如何遷戶口(離婚后戶口怎么遷出來(lái))
房子拆遷和戶口有關(guān)嗎(拆遷和戶口本上所有人都有關(guān)嗎)