天天看點

SQL2005中的幾種限制

限制(constraint):限制是SQL Server提供的自動保持資料庫完整性的一種方法,

它通過限制字段中資料、記錄中資料和表之間的資料來保證資料的完整性。

在SQL SERVER中,對于基本表的限制分為列限制和表限制。

(要想看列限制和表限制的差別,請看檢查限制的例子。)

列限制是對某一個特定列的限制,包含在列定義中,直接跟在該列的其他定義之後,用空格分隔,

不必指定列名;

表限制與列定義互相獨立,不包括在列定義中,通常用于對多個列一起進行限制,與列定義用’,’分隔,

定義表限制時必須指出要限制的那些列的名稱。

1)建立限制

完整性限制的基本文法格式為:

   [CONSTRAINT constraint_name(限制名)] <限制類型>

   限制不指定名稱時,系統會給定一個名稱。

在SQL Server 2005中有6種限制:

主鍵限制(primary key constraint)、

惟一性限制(unique constraint)、

檢查限制(check constraint)、

預設限制(default constraint)、

外部鍵限制(foreign key constraint)

空值(NULL)限制。

建立檢查限制常用的操作方法有如下兩種 :

使用SQL Server管理平台建立檢查限制(即右鍵,選擇,點選的過程);

用Transact-SQL語句建立檢查限制。

2)檢查限制 CHECK

檢查限制對輸入列或者整個表中的值設定檢查條件,以限制輸入值,保證資料庫資料的完整性。

這裡全選sql語句寫的限制做例子。

用Transact-SQL語句建立檢查限制。其文法形式如下:

   CONSTRAINT constraint_name

   CHECK [NOT FOR REPLICATION]

   (logical_expression)

例(注:下面為列限制)

CREATE TABLE 我的會員

(

會員編号 smallint NOT NULL CONSTRAINT MemberNoChk

CHECK (會員編号 BETWEEN 1 AND 10000),

姓名 nvarchar(20) NOT NULL,

位址 nvarchar(60) NOT NULL

);

GO

(注:下面為表限制)

看清楚了沒有:列限制和表限制的差別就是列限制是直接跟在後面,而表限制則不是。

CREATE TABLE 我的會員

(

會員編号 smallint NOT NULL,

姓名 nvarchar(20) NOT NULL,

位址 nvarchar(60) NOT NULL,

CONSTRAINT ChkMemberNo

CHECK (會員編号 BETWEEN 1 AND 10000)

);

GO

2)主鍵限制PRIMARY KEY

PRIMARY KEY限制用于定義基本表的主鍵,它是惟一确定表中每一條記錄的辨別符,

其值不能為NULL,也不能重複,以此來保證明體的完整性。

PRIMARY KEY與UNIQUE限制類似,通過建立唯一索引來保證基本表在主鍵列取值的唯一性,

但它們之間存在着很大的差別:

①在一個基本表中隻能定義一個PRIMARY KEY限制,但可定義多個UNIQUE限制;

②對于指定為PRIMARY KEY的一個列或多個列的組合,其中任何一個列都不能出現空值,

而對于UNIQUE所限制的唯一鍵,則允許為空。

注意:不能為同一個列或一組列既定義UNIQUE限制,又定義PRIMARY KEY限制。

PRIMARY KEY既可用于列限制,也可用于表限制。

使用Transact-SQL語句操作法設定主鍵限制,其文法形式如下:

   CONSTRAINT constraint_name

   PRIMARY KEY [CLUSTERED|NONCLUSTERED]

(column_name)

PRIMARY KEY用于定義表限制時,即将某些列的組合定義為主鍵,其文法格式如下:

   CONSTRAINT constraint_name

   PRIMARY KEY [CLUSTERED|NONCLUSTERED]

(column_name[,…n])

3)惟一性限制UNIQUE

使用Transact-SQL語句完成惟一性限制的操作,其文法形式如下:

CONSTRAINT constraint_name

UNIQUE [CLUSTERED|NONCLUSTERED]

(column_name[,…n])

CREATE TABLE 我的員工

(

員工編号 int IDENTITY(10,10) NOT NULL CONSTRAINT PK_員工編号_我的員工 PRIMARY KEY ,

身份證号碼 char(10) NOT NULL CONSTRAINT UQ_身份證号碼_我的員工 UNIQUE,

技能檢定編号 char(6) NOT NULL CONSTRAINT UQ_技能檢定編号_我的員工 UNIQUE,

姓名 nvarchar(16) NULL,

電話号碼 char(11) NULL,

行動電話 int NULL,

CONSTRAINT UQ_姓名_電話号碼_我的員工 UNIQUE (姓名, 電話号碼),

CONSTRAINT UQ_姓名_行動電話_我的員工 UNIQUE (姓名, 行動電話)

);

4)外部鍵限制FOREIGN KEY

     外鍵 (FOREIGN KEY) 是用于建立和加強兩個表資料之間的連結的一列或多列。

外部鍵限制用于強制參照完整性。

      當使用外部鍵限制時,應該考慮以下幾個因素:

外部鍵限制提供了字段參照完整性;

外部鍵從句中的字段數目和每個字段指定的資料類型都必須和REFERENCES從句中的字段相比對;

外部鍵限制不能自動建立索引,需要使用者手動建立;

使用者想要修改外部鍵限制的資料,必須有對外部鍵限制所參考表的SELECT權限或者REFERENCES權限;

參考同一表中的字段時,必須隻使用REFERENCES子句,不能使用外部鍵子句;

一個表中最多可以有253個外部鍵限制;

在臨時表中,不能使用外部鍵限制;

主鍵和外部鍵的資料類型必須嚴格比對

5)預設限制 DEFAULT

預設限制指定在插入操作中如果沒有提供輸入值時,則系統自動指定值。

預設限制可以包括常量、函數、不帶變元的内建函數或者空值。

建立預設限制的Transact-SQL語句操作法。其文法形式如下:

CONSTRAINT constraint_name

   DEFAULT constraint_expression [FOR column_name]

CREATE TABLE 我的員工

位址 varchar(60) NOT NULL DEFAULT '北京市',

年收入 money NULL DEFAULT 10000 )

GO

6)空值限制NULL | NOT NULL

空值(NULL)限制用來控制是否允許該字段的值為NULL。NULL值不是0也不是空白,

更不是填入字元串的“NULL”字元串,而是表示“不知道”、“ 不确定”或“沒有資料”的意思。

當某一字段的值一定要輸入才有意義的時候,則可以設定為NOT NULL。

如主鍵列就不允許出現空值,否則就失去了唯一辨別一條記錄的作用。

空值(NULL)限制隻能用于定義列限制。

使用Transact-SQL語句設定空值(NULL)限制, 其文法形式如下:

     [CONSTRAINT <限制名> ][NULL|NOT NULL]

建立一個S表,對SNO字段進行NOT NULL限制。

程式清單如下:

CREATE TABLE S

(SNO CHAR(10) CONSTRAINT S_CONS NOT NULL,

SN VARCHAR(20),

AGE INT,

SEX CHAR(2) DEFAULT '男' ,

..................

----------------------------

限制主要包括:

主鍵限制(primary key constraint)、

惟一性限制(unique constraint)、

檢查限制(check constraint)、

預設限制(default constraint)、

外部鍵限制(foreign key constraint)

空值(NULL)限制。

1、not null :用于控制字段的内容一定不能為空(NULL)。

     用法 :Create table MyTable

               (

                   id varchar(32) not null,

                   name varchar (32)

               )

2、Unique :控件字段内容不能重複,一個表允許有多個 Unique 限制。

      在Sql Server、Orcale、MS Access 支援的添加 Unique 文法:

             Create table MyTable

                (

                    id varchar(32) not null unique,

                    name varchar (32)

                )

      在Sql Server、 My Sql 支援的添加 Unique 文法:

             Create table MyTable

                (

                    id varchar(32) not null,

                    name varchar (32),

                   unique (id,.....)

                 )

      在Sql Server、Orcale、MS Access、My Sql 都支援的添加 Unique 文法:

              Create table MyTable

                  (

                      id varchar(32) not null,

                      name varchar (32),

                     Constraint uniqueName unique(UniqueColumn,.....)

                   )

      注:第一種寫法(也就是在字段後面直接添加限制),保證每個字段資料唯一性。

          第二種寫法(也就是同時添加幾個字段為限制),這個是保證幾個字段資料同時是唯一的,比如 Unique(id,name) 兩個字段為限制,那麼當 id 有重複值,而 name 沒有重複值的情況下是允許的,隻有當兩個字段資料都與原資料重複的情況下才是不允許的。

   在Sql Server、Oracle、MS Access 删除 Unique 限制文法:drop constraint UniqueName;

   在My Sql 删除 Unique 限制文法:drop index UniqueName;

3、Primary Key :也是用于控件字段内容不能重複,但它在一個表隻允許出現一個。

      在Sql Server、Orcale、MS Access 支援的添加Primary Key文法:

              Create table myTB1

             (

                 id nvarchar(32) not null primary key,

                 name nvarchar(32)

              )

      在Sql Server、My Sql 支援的添加Primary Key 文法:

             Create table myTB1

             (

                 id nvarchar(32) not null,

                 name nvarchar(32),

                 primary key (id)

             )

       在Sql Server、Orcale、MS Access、My Sql 支援的添加Primary Key 文法:

             Create table myTB1

             (

                  id nvarchar(32) not null,

                 name nvarchar(32),

                 constraint PrimaryName primary key (id)

              )

在Sql Server、Orcale、MS Access、My Sql 表已存在的情況下,添加表的Primary Key限制文法:

              Alter table myTB1

              ADD Primary Key (id,......) --這樣的寫法,系統會自定義限制名稱

              Alter table myTB1

              Add Constaint PrimaryName primary key (id) --這樣的寫法,自己可以自定義限制名稱

在Sql Server、Orcale、MS Access 删除表已存在的 Primary Key 限制的文法:

              Alter table myTB1

              Drop Constraint PrimaryName

在My Sql 删除表已存在的 Primary Key 限制的文法:

              Alter table myTB1

              Drop Primary Key

Unique 與 Primary 的相同之處:UNIQUE 和 PRIMARY KEY 限制均為列或列集合提供了唯一性的保證。

Unique 與 Primary 的不同之處:每個表可以有多個 UNIQUE 限制,但是每個表隻能有一個 PRIMARY KEY 限制,Unique允許有NULL值,而 Primary key 不允許有NULL值。

注:在同一個資料庫中,就算在不同的表中,限制名稱是不允許相同的。

4、Foreign Key :FOREIGN KEY 限制用于預防破壞表之間連接配接的動作,FOREIGN KEY 限制也能防止非法資料插入外鍵列,因為它必須是它指向的那個表中的值之一。

   在Sql Server、My Sql 支援的添加Foreign Key文法:

              Create table myTB1

              (

                   id nvarchar(32) not null primary key,

                   name nvarchar(32),

                   foreign key(id) references myTB(id)

              )

   在Sql Server、Orcale、MS Access 支援的添加Foreign Key文法:

              Create table myTB1

              (

                   id nvarchar(32) not null foreign key references myTB(id),

                   name nvarchar(32)

              )

   在Sql Server、Orcale、MS Access、My Sql 都支援的添加Foreign Key文法:

              Create table myTB1

              (

                   id nvarchar(32) not null primary key,

                   name nvarchar(32),

                    Constraint foreignName foreign key(id) references myTB(id)

              )

在Sql Server、Orcale、MS Access、My Sql 的表已存在情況下,向表添加外鍵限制的文法:

              Alter table myTB1

              Add foreign key(id) references myTB(id) --這樣寫系統會自定義限制名稱

               Alter table myTB1

              Add Constraint foreignName foreign key(id) references myTB(id) --這樣寫自己可以自定義限制名稱

在Sql Server、Orcale、MS Access 中删除外鍵限制的文法:

              Alter table myTB1

              Drop Constraint foreignName;

在My Sql 中删除外鍵限制的文法:

              Alter table myTB1

              Drop foreign key foreignName;

5、Check :用于控制字段的值範圍。

      在Sql Server、My Sql 支援的添加check 文法:

              Create table myCheck

              (

                   id nvarchar(32) not null,

                   age int not null,

                   check (age>15 and age <30)

              )

       在Sql Server、Orcale、MS Access 支援的添加 check 文法:

              Create table myCheck

              (

                   id nvarchar(32) not null,

                   age int not null check (age>15 and age<30)

              )

      在Sql Server、Orcale、MS Access、My Sql 都支援的添加 check 文法:

               Create table myCheck

              (

                   id nvarchar(32) not null,

                   age int not null,

                   constraint checkName check (age<15 and age>30)

              )

在Sql Server、Orcale、MS Access、My Sql 的表已存在情況下,向表添加check限制的文法:

              Alter table myCheck

              add check (id='celly'); --這樣定義是系統自定義 check限制名稱。

              Alter table myCheck

               add constraint checkName check(id='celly'); --這樣定義是自己自定義 check限制名稱。

在 Sql Server、Orcale、MS Access 删除表已存在的 check 限制的文法:

              Alter table myCheck

              drop constraint checkName

6、Default :用于設定新記錄的預設值。

      在Sql Server、Orcale、MS Access、My Sql 添加default限制的文法:

              Create table myDefault

              (

                  id int,

                  name nvarchar(32) default 'celly'

              )

      在My Sql 的已存在表中添加 字段預設值:

               Alter table myDefault

              Alter [id] set default 0

      在 Sql Server、Orcale、MS Access 的已存在表中添加 字段預設值:

              Alter table myDefault

              Alter column [id] set default 0

      在 My Sql 中删除字段預設值文法:

              Alter table myDefault

              Alter ColumnName drop default

本文來自CSDN部落格,轉載請标明出處:

http://blog.csdn.net/fancy050821/archive/2009/05/13/4176212.aspx

-------------------------------------------

sql server中增加限制的語句是:

---添加主鍵限制

alter table 表名 add constraint 限制名 primary key (主鍵)

---添加唯一限制

alter table 表名 add constraint 限制名 unique (字段)

---添加預設限制

alter table 表名 add constraint 限制名 default ('預設内容') for 字段

--添加檢查check限制,要求字段隻能在1到100之間

alter table 表名 add constraint 限制名 check (字段 between 1 and 100 )

---添加外鍵限制(主表stuInfo和從表stuMarks建立關系,關聯字段為stuNo)

alter table 從表 add constraint 限制名 foreign key(關聯字段) references 主表(關聯字段)

GO

--sql server中删除限制的語句是:

alter table 表名 drop constraint 限制名

sp_helpconstraint 表名 找到資料表中的所有列的限制

在查詢分析器中執行

-----------------------------------------------

SQL SERVER 2005中,限制,Constraints,顧名思義,就是按照約定來束縛某種東西。

在資料庫,無非就是對存儲的資料進行束縛,當然需要按照某種既定的規則,

一般是指語義的限制以及用來制約屬性上的關系。可能在平時的工作中,尤其是對開發人員來說,

限制用的不是很多,更多的時候是用代碼去做一些輸入的驗證,這其實就是限制的思想,

把不滿足條件的資料排除在外。其實SQL SERVER 2005也給我們提供這樣的一些限制:

1.         Check Constraints

我相信大部分的朋友對限制的概念了解應該都是Check類型的限制,

這種限制對表中的某一列的格式或者值進行限制,隻有滿足條件的資料才能被寫入。比如:

create table Goods

(

   GoodsID int identity(1,1) primary key,

   Price decimal(12,4) constraint chkPrice check (Price>1000)

)

上面的SQL建立了一張新表,并且對表中的列Price建立一個check限制,名叫chkPrice,

它的作用就是對插入price列的資料進行判斷,如果大于1000,滿足條件就插入,否則就報錯。

insert into Goods values(2000)

--(1 row(s) affected) 成功

insert into Goods values(200)

--ERROR:The INSERT statement conflicted with the CHECK constraint "chkPrice". T

--he conflict occurred in database "AdventureWorks", table "dbo.Goods", column 'Price'.

這裡順便提一下,如果我們執行了下面的代碼,結果會是怎樣呢?

insert into goods values(null)

如果你覺得也會報錯,那麼恭喜你,你錯了。限制其實是對滿足條件,

即條件表達式傳回TRUE的一律通過。那麼,如果結果是NULL呢?NULL在SQL SERVER裡的類型是UNKNOWN

,就是不知道。那我們就要把它了解成可以成為任何類型,可能為TRUE。是以在這個例子中,

NULL是可以被插入的。

2.         Default Constraints

 這個限制相對簡單一些,就是事先定義一個預設值,如果在插入資料的時候沒有指定,

系統會自動把事先定義好的預設值寫入對應的列。

create table Product(

ProductID int identity(1,1) primary key,

ProductName varchar(80) not null,

Country varchar(40) default 'China'

)

Country這列就是一個含有Default限制的列,如果在插入一條資料的時候沒有指定值,

那麼系統會預設的插入China.

insert into product values('AAA','US')

insert into product(ProductName) values('BBB')

--結果為

--      1 AAA US

--

--      2 BBB China

3.         Unique Constraints

     Unique就是獨有的,這個限制就是確定在非主鍵列中不輸入重複的值。

這一點與主鍵的概念可能有一些類似,之是以把Unique放在前面說,就是為了強調一點,

如果想強制一列或者多列的組合的唯一性時,應該選擇Unique而不是主鍵。

     同時,還有一點,主鍵不能為null,但是Unique可以支援null。

alter table product  add ProductCode int null constraint pc_unique unique

我們對Product表中的ProductCode列設定了unique限制,這一列的值不可重複.但允許有空值存在.

insert into product (productname,ProductCode) values('aaa',null)

--OK 第一個空值插入成功

insert into product (productname,ProductCode) values('bbb',null)

--ERROR:Violation of UNIQUE KEY constraint 'pc_unique'.

--Cannot insert duplicate key in object 'dbo.product'.

--第二個空值插入失敗

4.         Primary Key Constraints

 主鍵限制可能是大家最為熟悉的,在資料庫的設計中,我們基本上會對每一張表建一個主鍵限制,

用以把資料庫的每條記錄(行)區分開來.主鍵可以針對表中的一列或多列。但與限制不同的是,

它的值不能為空。

下面的例子是對其中一列設定主鍵:

Create Table Users(

 UserID int primary key,

 UserName varchar(50) not null

)

 下面是對多列設定主鍵:

CREATE TABLE KeyData

(

    FiscalYear int not null,

    Period int not null,

    DataType int not null,

    KeyValue int not null

    CONSTRAINT [PK_constraint_keydata] PRIMARY KEY CLUSTERED

    (

        FiscalYear,

        Period

    )

)

5.         Foreign Key Constraints

前面提到限制分語義上限制和屬性關系的限制,外鍵限制就是用來限制屬性間關系的。

通俗一點講,就是一張表中的某列引用了另一張表的主鍵,因為該列的值必須出自主鍵列的值。

Create table Manager

(

    ManagerID int primary key,

    ManagerName varchar(50),

)

上面我們建立了一個Manager的表,有一個ID列是該表的主鍵,唯一代表了每一個經理。

下面建立了銷售區域的表,并指定每個區域有一個經理負責:

Create Table SalesRegion

(

    SalesRegionID int Primary Key,

    SalesRegionName varchar(100),

    ManagerID int foreign key REFERENCES Manager(ManagerID)

)

從上面的指令中可以看出,ManagerID就是外鍵,它的作用是連接配接了SalesRegion與Manager兩張表,

限制ManagerID在表SalesRegion中的使用,我們不能把某個區域指定給一個不存在經理負責。

如果我們試圖往SalesRegion插入一條記錄,而該記錄的ManagerID是Manager表中不存在的ManagerID,

系統就會報出以下的錯誤:

--The INSERT statement conflicted with the FOREIGN KEY constraint

--"FK__SalesRegi__Manag__3F6663D5". The conflict occurred in database "AdventureWorks",

--table "dbo.Manager", column 'ManagerID'.