SQL 约束

来源:互联网 发布:网络机房建设报价单 编辑:程序博客网 时间:2024/05/16 05:47
 

主键:唯一标识表中的所有行

主键强制实体完整性,也就是说必须是明确的和唯一的。

创建有主键的表:

CREATE TABLE Product

(

  ID int NOT NULL PRIMARY KEY,

...

)

为既有表增加主键约束

ALTER TABLE Product

ADD CONSTRAINT PK_Id

PRIMARY KEY (ID)

外键:在表之间发起和强制一些关系来帮助保持参照完整性。

CREATE TABLE EmployeeCrediting

(

  EmployeeCreditRating int NOT NULL PRIMARY KEY,

  EmployeeID int NOT NULL,

  CreditRatingID int NOT NULL,

  CONSTRAIN FK_EmployeeCreditRating_Employee

  FOREIGN KEY(EmployeeID)

  REFERENCES Employe(EmployeeID),

)

为既有表增加外键:

ALTER TABLE EmployeeCrediting

ADD CONSTRAIN FK_EmployeeCreditRating_Employee

  FOREIGN KEY(EmployeeID)

  REFERENCES Employe(EmployeeID),

创建唯一结束:强制唯一性

CREATE TABLE TABLEA(

Column3 int not null UNIQUE  --创建一列结束

...

CONSTRAIN UNQ_Column1_Column2  --创建多列结束

UNIQUE(Column1,Column2)

为既有表增加UNIQUE约束:

ALTER TABLE TableA

ADD CONSTRAIN UNQ_Culture_Name

UNIQE(Name)

DEFAULT约束

DEFAULT用于设置某一列的默认值。

CREATE TABLE TableA

(

 SchoolName varchar(20) NOT NULL DEFAULT 'GYU'

)

为既有表增加DEFAULT约束:

ALTER TABLE TableA

ADD CONSTRAINT DF_ShcoolName

DEFAULT 'GYU'

FOR SchoolName

CHECK约束:用于定义列允许的格式和值:

CHECK (规定的格式)

如:

CREATE TABLE TableA

(

  columnA int NOT NULL CHECK(columnA .>0 AND columnA <10)

)

CHECK约束中引用多个列时:

CONSTRAINT CK_EmployeeType

CHECK (educationID>1 AND GPA>2.5 AND GPA<4.0)

为既有表增加CHECK约束

ALTER TABLE TableA WITH NOCHECK

ADD CONSTRAIN CK_STUDENT

CHECK(Name NOT LIKE '%张三%'

增加 WITH NOCHECK,表示既有值会被忽略,只有新的值才会使用CHECK约束进行校验。

禁止和启用约束

要向数据库中插入违反约束的数据时,可以使用NOCHECK

NOCHECK能用来禁止CHECKFORGIEN KEY约束,允许你插入违反约束规则的行。

禁用约束:

ALTER TABE TableA

NOCHECK CONSTRAINT FK_TableA_TableB

... 

插入数据操作

...

重新启用约束:

ALTER TABE TableA

CHECK CONSTRAINT FK_TableA_TableB

还可以使用ALL关键字来禁止所有的外键和检查约束

NOCHECK CONSTRAINT ALL

启用所有的约束

CHECK CONSTRAINT

从表删除约束

ALTER TABLE TableA

DROP CONSTRAINT FK_TableA_TableB

临时表和表变量

临时表像普通表那样定义,只是它们保存在tempdb数据库中。创建临时表可以:

替代游标。例如:你可以生成一个临时表来替代使用T-SQL游标的方式来遍历结果集,根据每一行执行任务。使用WHILE循环,你能遍历表中的每一行,为某执行操作,然后从临时表中删除行。

作为结果集额外的存储空间。

作为一个临时的,低开销的查找表。

临时表有两种不同的表类型:本地和全局。本地临时表有一个#前缀,全局临时表有##前缀。

本地临时表对于创建它们的当前用户连接可用。多个连接能创建多个名字相同的临时表,而不会引起冲突。本地临时表可以通过DROP语句来删除,或者当用户连接关闭后自动删除

和本地临时表不同,你不能创建相同版本的全局临时表因为这样会产生命名冲突。全局临时表需要显示的使用DROP TABLE来从SQL SERVER中移除。

CREATE  TABLE #TABLE

(

  ID INT,

  NAME VARCHAR(12)

)

INSERT INTO #TABLE

VALUES

(1,'1')

SELECT * FROM #TABLE

表变量:表变更和创建表的语法相似,不同的是使用DECLARE来声明:

DECLARE @TABLE TABLE

(

  ID INT,

  NAME VARCHAR(12)

)

INSERT INTO @TABLE

VALUES

(1,'1')

SELECT * FROM @TABLE

表变更的语句必须同时执行。如上面三个语句必须一次性同时执行才能有效。如果先执行第一条声明表变更,再执行插入会报错:必须声明表变量"@TABLE"