SQL中的約束

        在SQL Server的運用過程種,對於初學者來說,總是會遇到很多棘手的問題,尤其對其中的約束種類就感到很吃力。以下是我借鑑別人後的發言後的一點心得體會。

        約束是SQL Server提供的自動保持數據庫完整性的一種方法,它通過限制字段中數據、記錄中數據和表之間的數據來保證數據的完整性。在SQL SERVER中,對於基本表的約束分爲列約束和表約束。列約束是對某一個特定列的約束,包含在列定義中,直接跟在該列的其他定義之後,用空格分隔,不必指定列名;而表約束與列定義相互獨立,不包括在列定義中,通常用於對多個列一起進行約束,與列定義用’,’分隔,定義表約束時必須指出要約束的列的名稱。

        在SQL Server 2005中有6種約束:主鍵約束(primary key constraint)、惟一性約束(unique constraint)、檢查約束(check constraint)、默認約束(default constraint)、外部鍵約束(foreign key constraint)和空值(NULL)約束。

        1.對於創建檢查約束 CHECK

檢查約束對輸入列或者整個表中的值設置檢查條件,以限制輸入值,保證數據庫數據的完整性。以下是sql語句寫的約束做例子。

用Transact-SQL語句創建檢查約束。其語法形式如下:
   CONSTRAINT constraint_name    CHECK   ( name logical_expression)

例1(注:下面爲列約束)
create table employees

(employeename varchar(50),
gender char(2) check(gender like 'f' or gender like 'm'),

例2.(注:下面爲表約束) 。

create table employees

(employeename varchar(50),

age int,

constraint checkage check (age between 10 and 100));

          從上面可以看出,列約束和表約束的區別就是列約束是直接跟在後面,而表約束則不是。


          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  (column_name)

PRIMARY KEY用於定義表約束時,即將某些列的組合定義爲主鍵,其語法格式如下:
   CONSTRAINT constraint_name  PRIMARY KEY  (column_name[,…n])

如果在添加一列之後再將其設置爲主鍵約束,這樣編寫:

ALTER TABLE employees ADD employeeid INT  NOT NULL ;

將會出錯:ALTER TABLE 只允許添加可包含空值或指定了 DEFAULT 定義的列。因爲列 'employeeid' 不能包含空值且未指定 DEFAULT 定義,所以無法將該列添加到表 'employees' 中。

只需要在上面的命令中添加default 001即可。

以下代碼是在SQL查詢分析器裏面建的相關數據庫或表:

create database instant2;
use instant2;
drop table employees;
create table employees(
employeename varchar(50),
gender char(2) check(gender like 'f' or gender like 'm'),          --爲gender添加檢查約束,保證輸入的數據是‘f’或‘m’
birthday datetime check(birthday <=getdate()),                          --爲birthday r添加檢查約束,保證輸入的數據小於當前系統時間

degree varchar(12),
graduateschool varchar(50),
graduatedate datetime check(graduatedate<=getdate()),
specialty varchar(200),
telephone varchar(50),
skill varchar(200),
salary smallint,
allowardce decimal(18,2));

exec sp_helpconstraint 'employees';
ALTER TABLE employees ADD employeeid INT  NOT NULL  default 001;   --
alter table employees add constraint pk_employeeid primary key(employeeid);
insert into employees(employeename,gender,birthday,degree,graduateschool,graduatedate,specialty,telephone,skill,salary,allowardce)
values('張三','m',1980-05-09,'大學本科','北京大學',2004-07-01,'自動化控制','390109999','熟悉面向對象系統分析和設計,精通java語言及j2ee技術,熟悉oracle、sql數據庫編程',5000,586.5);
select *from employees;

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章