Ms SQL Server 約束和規則

一、SQL約束

 約束定義關于列中允許值的規則,是強制完整性的標準機制。 

使用約束優先于使用觸發器、規則和默認值。查詢優化器也使用約束定義生成高性能的查詢執行計劃。

1:類型
約束的類型一共分三種
域約束: 涉及一個或多個列,(限制某一列的數據大于0)
實體約束: 相同的值不能存在于其他的行中
引用完整性約束: 一個表中的一個列與某個表中的另一個列的值匹配
2:命名
約束是可以命名的 一般這樣命名:
pk_customer_***
pk代表主鍵 customer代表主鍵所在的表后面是你自己定義的(要確保整個名稱的唯一性)
3:主鍵約束
主鍵約束:一般就是id, 一個表中最多有一個主鍵
例子1
use accounting
create table employee
(

id int identity not null,
firstname varchar(20) not null
)
例子2
use accounting
alter table employee
add constraint pk_employeeid
primary key (id)

4:外鍵約束
外鍵約束用在確保數據完整性和兩個表之間的關系上
先看例子
create table orders
(
id int identity not null primary key,
customerid int not null foreign key references customer(id),
orderdate smalldatetime not null,
eid int not null
)
注意:這個表的外鍵必須是另一個表的主鍵!
在現有表上添加外鍵
alter table orders
add constraint fk_employee_creator_order
foreign key (eid) references employee(employeeid)
使用表自引用
表內至少要有一行數據才可以這么做
alter table employee
add constraint fk_employee_has_manager
foreign key (managerid) references employee(employeeid)
創建表的時候做表自引用 就可以忽略 foreign key 語句
表自引用的外鍵列 必須允許為null 要不是不允許插入的(避免對最初行的需要)

一個表與另一個表有約束,這個表是不能被刪除的
級聯操作
先看例子
create table orderdetails
(
orderid int not null ,
id int not null ,
description varchar(123) not null,
--設置主鍵
constraint pkOrderdetails primary key (orderid,id),
--設置外鍵,級聯操作
constraint fkOrderContainsDetails
foreign key (orderid)
references orders(orderid)
on update no action
on delete cacade
)

on delete cacade 當刪除父記錄時 同時刪除該記錄
也就是當刪除orders表中的一條記錄,
與之相關的orderdetails表中的記錄也將被刪除
級聯的深度是沒有限制的,但是每個外鍵都必須設置on delete cacade
no action是可選的

5:unique約束
unique約束與主鍵約束類似,同樣也是要求指定的列有唯一的值
但是一個表中可以有多個unique約束的列,同時這個列允許存在null值。(最多有一個null值)
看例子:
create table shippers
(
id int indentity not null primery key,
zip varchar(10) not null ,
phoneno varchar(14) not null unique

)
例子二:
alter table employee
add constraint ak_employeeSSN
unique(ssn)

6:check約束
check不局限于一個特定的列,可以約束一個列,也可以通過某個列來約束另一個列
定義check約束使用的規則與where子句中的基本一樣
下面我寫幾個
between 1 and 12
like '[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
in ('ups','fed ex','usps')
price >=0
shipdate >= orderdate
看例子:
alter table customers
add constraint cn_customerDateinsystem
check
(dateinsystem <= getdate())
getdate()函數得到當前時間,上面這個例子的意思是dateinsystem列的數據不能大于當前時間
現在如果給這個列插入一個明天的時間,就會出錯

7:default約束
如果插入的新行在定義了默認值的列上沒有給出值,那么這個列上的數據就是定義的默認值
默認值只在insert語句中使用
如果插入的記錄給出了這個列的值,那么該列的數據就是插入的數據
如果沒有給出值,那么該列的數據總是默認值

8:禁用約束
在創建約束之前,數據庫中已經有一些不符合規矩的數據存在。
創建約束之后,又想加入一些不符合規矩的數據。
這些時候就要禁用約束。primary key 和 unique約束 這對孿生約束是不能禁用的
對一個已經存在數據的表加一個約束:
alter table customers
add constraint cn_customerPhoneNo
check
(phone like '([0-9][0-9][0-9])[0-9][0-9][0-9][0-9][0-9][0-9]')
如果表內有不符合這個約束的記錄,sqlserver就會報錯
如果這樣寫,就不會報錯了
alter table customers
with no check
add constraint cn_customerPhoneNo
check
(phone like '([0-9][0-9][0-9])[0-9][0-9][0-9][0-9][0-9][0-9]')
如果需要把一些不符合規矩的數據加入到表中怎么辦

這時候就需要臨時禁用現有的約束:
alter table customers
nocheck
constraint cn_customerPhoneNo
--允許不帶套插入,此處的名稱是前面定義的
insert into customer (phone) values (123456)
--開始不帶套插入!
alter table customers
check
constraint cn_customerPhoneNo
--下次插入要帶套

?

9. FOREIGN KEY約束標識表之間的關系。

   
一個表的外鍵指向另一個表的候選鍵。當外鍵值沒有候選鍵時,外鍵可防止操作保留帶外鍵值的行。在下例中,order_part 表建立一個外鍵引用前面定義的part_sample表。通常情況下,order_part在order表上也有一個外鍵,下面只不過是一個簡單示例。
CREATE TABLE order_part
(
order_nmbr int,
part_nmbr int
FOREIGN KEY REFERENCES part_sample(part_nmbr) ON DELETE NO ACTION,
qty_ordered int
)
如果一個外鍵值沒有候選鍵,則不能插入帶該值(NULL除外)的行。如果嘗試刪除現有外鍵指向的行,ON DELETE子句將控制所采取的操作。
ON DELETE子句有兩個選項:
A、NO ACTION指定刪除因錯誤而失敗。
B、CASCADE 指定還將刪除包含指向已刪除行的外鍵的所有行。
如果嘗試更新現有外鍵指向的候選鍵值,ON UPDATE 子句將定義所采取的操作。它也支持NO ACTION和CASCADE選項。

10、列約束和表約束

 
約束可以是列約束或表約束:
列約束被指定為列定義的一部分,并且僅適用于那個列(前面的示例中的約束就是列約束)。
表約束的聲明與列的定義無關,可以適用于表中一個以上的列。
當一個約束中必須包含一個以上的列時,必須使用表約束。
例如,如果一個表的主鍵內有兩個或兩個以上的列,則必須使用表約束將這兩列加入主鍵內。假設有一個表記錄工廠內的一臺計算機上所發生的事件。假定有幾類事件可以同時發生,但不能有兩個同時發生的事件屬于同一類型。這一點可以通過將type列和time列加入雙列主鍵內來強制執行。
CREATE TABLE factory_process
(
event_type int,
event_time datetime,
event_site char(50),
event_desc char(1024),
CONSTRAINT event_key PRIMARY KEY(event_type,event_time)
)



二、規則

規則是一個向后兼容的功能,用于執行一些與CHECK約束相同的功能。CHECK約束是用來限制列值的首選標準方法。CHECK約束比規則更簡明,一個列只能應用一個規則,但是卻可以應用多個CHECK約束。CHECK約束作為CREATE TABLE 語句的一部分進行指定,而規則以單獨的對象創建,然后綁定到列上。   
下例創建一個規則,執行與前面主題中的CHECK約束示例相同的功能。SQL Srver2005 首選的方法是 CHECK 約束。
CREATE RULE id_chk AS @id BETWEEN 0 and 10000
GO
CREATE TABLE cust_sample
(
cust_id int
PRIMARY KEY,
cust_name char(50),
cust_address char(50),
cust_credit_limit money,
)
GO
sp_bindrule id_chk,'cust_sample.cust_id'
GO


再看例子:
Create rule SalaryRule
as @salary >0;
sp_bindrule 'SalaryRule' , 'Employee.Salary'
第一句定義了一個規則叫SalaryRule
進行比較的事物是一個變量
這個變量的值是所檢查的列的值
第二句把規則綁定到某個表的一個列上

規則和ckeck約束很相似,
但是規則只作用在一個列上
一個規則可以綁定在多個列上,但是它不會意識到其他列的存在
check可以定義column1>=column2

取消規則
exec sp_unbindrule 'Employee.Salary'

刪除規則
Drop rule SalaryRule

1:默認值


默認值與default約束類似(有區別的,但是我說不清楚)
先看例子:
create default salarydefault
as 0;
exec sp_binddefault
'salarydefault' , 'employee.salary';
取消默認值:
exec sp_unbinddefault 'employee.salary'
刪除默認值:
drop default 'salarydefault'

外記:

在Create Table 語句的屬性清單后,加上外部碼說明子句,格式為:
FOREIGN KEY <屬性名表1> REFERENCES <表名>(<屬性名表2>)
eno char(4) CONSTRAINT PK_employee PRIMARY KEY,
dno char(4)CONSTRAINT FK_employee FOREIGN KEY REFERENCES department(dno);
ALTER TABLE語句來更新與屬性或表有關的各種約束。如:
ALTER TABLE employee DROP CONSTRAINT FK_employee;
ALER TABLE Salary ADD CONSTRAINT RightSalary CHECK(Insure+Fund<Rest);

轉載于:https://www.cnblogs.com/sczw-maqing/p/3253102.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259487.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259487.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259487.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Qt 獨立運行時伴隨CMD命令窗口

用Qt寫了一個小軟件&#xff0c;在把程序release后&#xff0c;打包分裝后&#xff0c;發現程序運行的時候會伴隨cmd命令窗口&#xff0c;可把我愁懷了 不過功夫不負有心人&#xff0c;在老師和我網友的幫助下&#xff0c;終于搞完了 CONFIG&#xff1a;指定工程配置和編譯參數…

Intellij IDEA 快捷鍵整理(dyCopy)

原文&#xff1a;http://www.cnblogs.com/tonycody/p/3257601.html【常規】CtrlShift Enter&#xff0c;語句完成“&#xff01;”&#xff0c;否定完成&#xff0c;輸入表達式時按 “&#xff01;”鍵CtrlE&#xff0c;最近的文件CtrlShiftE&#xff0c;最近更改的文件ShiftC…

長豎線及長括號

轉載&#xff1a;http://blog.sina.com.cn/s/blog_6005d4af0101861l.html 文章修改中要求把花括號和豎線變長&#xff0c;查了下發現下面的幾種方法&#xff1a; 1.花括號“{ }”變長&#xff1a; $\left\{...\right\}$&#xff1b; 或者用 $\Big\{...\Big\}$; 2.豎線“|”變長…

php 加入日志功能,php怎么寫一個日志功能的函數

我們要寫一個寫日志的函數,首先需要了解需求,我們一般怎么用日志函數呢?例如,程序執行到某一步,我希望把這個變量(地址)$user_address的值打印到日志,我們希望日志里是這么寫的:xx-xx-xx xx:xx $user_address : 上海市楊浦區xxxxx然后每一條日志都要換行,都有日期時間,假設 函…

Ant簡單工程的構建

1.在Ant的官方網站http://ant.apache.org/bindownload.cgi下載Ant最新版本&#xff08;我下載的是apache-ant-1.8.2-bin.zip&#xff09;&#xff0c;Ant無需安裝&#xff0c;直接解壓后設置環境變量即可。 2.測試Ant是否安裝成功&#xff0c;在控制臺運行ant命令&#xff0c;出…

MVC學習四

第七節 講述了增加model中類的屬性&#xff0c;由于數據庫中已存在表&#xff0c;表中沒有存在新加的列&#xff0c;所以可以刪除數據庫或者在數據庫中新增一列&#xff0c;另可以在controller中新增一個數據庫初始化的類&#xff0c;并在Global.asax添加初始化數據庫的代碼 …

mysqlpump 備份文件壓縮對比

mysqldump&#xff0c;使用single-transaction&#xff0c;通過管道使用gzip壓縮&#xff0c;20G單數據庫備份real8m15.291suser8m39.617ssys0m16.675s備份文件1.43Gmysqlpump&#xff0c;4線程&#xff0c;使用single-transaction&#xff0c;通過管道使用gzip壓縮&#xff0c…

如何讓Latex公式字體變小

轉載&#xff1a;http://blog.sina.com.cn/s/blog_5e16f1770100gdxh.html 第一種方法&#xff1a;用比較笨的方法&#xff0c;一個一個公式用 \begin{small} \begin{equation} \ldots \end{equation} \end{small} 第二種方法&#xff1a;定義新的變量環境 在開始 \newenvironme…

php 正則表達式驗證金額,php 正則表達式驗證數字

非負浮點數(正浮點數 0)&#xff1a;^d(.d)?$正浮點數 ^(([0-9].[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9])|([0-9]*[1-9][0-9]*))$非正浮點數(負浮點數 0) ^((-d(.d)?)|(0(.0)?))$負浮點數 ^(-(([0-9].[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9])|([0-9]*[1-9]…

ASP.NET MVC:會導致鎖定的會話

背景 一直沒有意識到會話的訪問會導致會話鎖定&#xff0c;現在想想這樣設計是非常合理的&#xff0c;不過某些情況下這樣會導致同一個會話的并發訪問非常低&#xff08;只能串行化&#xff09;&#xff0c;好在MS提供了機制讓我們控制這種鎖。 測試 A頁面&#xff1a;緩存寫入…

.NET重構(四):窗體繼承+模板方法,完美實現組合查詢

導讀&#xff1a;在機房重構中&#xff0c;有好些個查詢都是大同小異&#xff0c;最為顯著的就是組合查詢了。怎樣給自己省事兒&#xff0c;相同的東西能不能重復利用&#xff0c;就成了一個現實的問題。第一遍做機房的時候&#xff0c;使用的更多的是&#xff1a;復制粘貼。學…

github常見操作和常見錯誤!錯誤提示:fatal: remote origin already exists.

原文鏈接&#xff1a;http://blog.csdn.net/dengjianqiang2011/article/details/9260435 如果輸入$ git remote add origin gitgithub.com:djqiang&#xff08;github帳號名&#xff09;/gitdemo&#xff08;項目名&#xff09;.git 提示出錯信息&#xff1a;fatal: remote or…

云計算的下半場

經常有人說互聯網上下半場的區別&#xff0c;大體上上半場燒錢&#xff0c;下半場分出勝負。自打美團王興拋出互聯網的下半場的說法&#xff0c;大家意識到這不僅僅是新美大的下半場&#xff0c;這更是整個互聯網行業的下半場。爆炸式的人口紅利帶來互聯網行業上半場的快速增長…

oracle中的l_satids,請問shared pool中的KQR L PO存放哪些數據

ROW CACHE 也叫做 dictionary cache &#xff0c;緩存數據字典基表如 OBJ$、COL$、IND$、SEQ$的信息以便解析SQL和library cache object。包括 KQR S PO &#xff0c; KQR M PO&#xff0c;KQR L PO &#xff0c; 等KQR > ROW CACHEkqr.h 1323 KSDTRADV("ROW_CACHE&quo…

This task is currently locked by a running workflow and cannot be edited

轉自&#xff1a;http://geek.hubkey.com/2007/09/locked-workflow.html 轉自&#xff1a;http://blogs.code-counsel.net/Wouter/Lists/Posts/Post.aspx?Listc04a88a9%2Dd138%2D4ac3%2Da2bb%2Db95c9fdd114e&ID118 SPWorkflow.AlertTask()的時候出現“This task is curren…

ETL模型設計

傳統的關系數據庫一般采用二維數表的形式來表示數據&#xff0c;一個維是行&#xff0c;另一個維是列&#xff0c;行和列的交叉處就是數據元素。關系數據的基礎是關系數據庫模型&#xff0c;通過標準的SQL語言來加以實現。 數據倉庫是多維數據庫&#xff0c;它擴展了關系數據庫…

《劍指offer》-整數中1出現的次數

題目描述 求出1~13的整數中1出現的次數,并算出100~1300的整數中1出現的次數&#xff1f;為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對于后面問題他就沒轍了。ACMer希望你們幫幫他,并把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的…

This is Me!——回顧第一個項目的前前后后

今天終于把論文敲完了&#xff0c;一路走來&#xff0c;頗多感想。遂寫下以下諸多文字&#xff0c;以饗讀者。 在說這個項目之前&#xff0c;先簡單介紹一下我的經歷。我叫王財勇&#xff0c;家是山西的&#xff0c;2009年至2013年在新疆大學就讀數學專業&#xff0c;也許有人…

從零開始學JavaScript三(變量)

一、變量 ECMAscript變量是松散型變量&#xff0c;所謂松散型變量&#xff0c;就是變量名稱可以保存任何類型的數據&#xff0c;每個變量僅僅是一個用于保存值的占位符。 定義變量時要使用var操作符 如&#xff1a; var message; /*定義一個名為message的變量&#xff0c;該變量…

DES加密過程例解

DES加密算法是最被廣泛使用的對稱加密算法&#xff0c;通過示例來演示DES、TribleDES&#xff08;3Key&#xff09; DES-ECB&#xff1a; 按8字節為單位進行加密&#xff0c;不足8字節補0key&#xff1a; 1111111111111111indata: 2222222222222222 OutData: 950973182317F8…