1.约束的类型
约束分为3大类:实体约束,域和参照完整性约束
域约束
定义:域约束就是对列的约束;
例如:上图的Unit Price 列要求价格必须大于0
实体约束
定义:实体约束就是对行的约束;
例如:例如要求每一行都有一个唯一值,例如主键
参照完整性约束
定义:如果某列的值必须与其他列的值匹配,就意味着创建了参照完整性约束;
例如:例如外键约束
2.键约束
键的类型分为:主键,外键,替换键,倒置键。主键约束
定义:主键是每一行的唯一标识符,并具有唯一值,不能为空。可以准确的获取数据库中的数据
例如:区分同一姓名
在创建数据库时添加主键:
USE Test1
CREATE TABLE Customers(
id int IDENTITY NOT NULL,
Name nvarchar(20) NOT NULL,
Age int NOT NULL
)
GO
CREATE TABLE Customers(
id int IDENTITY NOT NULL,
Name nvarchar(20) NOT NULL,
Age int NOT NULL
)
GO
在已存在的表上添加主键
USE Test1
ALTER TABLE MyTable
ADD CONSTRAINT PK_Employees
PRIMARY KEY(id)
GO
ALTER TABLE MyTable
ADD CONSTRAINT PK_Employees
PRIMARY KEY(id)
GO
外键约束
定义:约束表与其他表之间的关系
语法:FOREIGN KEY
案例:
USE Test1
CREATE TABLE aaaa
(
id int primary key IDENTITY not null,
Name nvarchar(20) not null,
p_id int foreign key references Customers(id)
)
GO
CREATE TABLE aaaa
(
id int primary key IDENTITY not null,
Name nvarchar(20) not null,
p_id int foreign key references Customers(id)
)
GO
注意:一个表中可以使用多个外键,最多可用253个外键。
给已存在的表添加外键:
ALTER TABLE MyTable
ADD constraint FK__dddd__p_id
foreign key (p_id) references Customers(id)
ADD constraint FK__dddd__p_id
foreign key (p_id) references Customers(id)
联级操作
定义:外键中进行自动删除和更新的过程称为联接。
案例:
USE Test1
CREATE TABLE OrderDetails(
OrderID int not null,
PartNo varchar(10) not null,
Description varchar(25) not null,
UnitPrice money not null,
Qty int not null,
CONSTRAINT PK_OrderDetails--关系名称
PRIMARY KEY (OrderID,PartNo),--创建两个主键
CONSTRAINT PK_OrderContainsDetails--关系名称
FOREIGN KEY (OrderID)--外键列
REFERENCES Orders(Id_O)--外键列的引用来自
--联级设置
ON UPDATE NO ACTION
ON DELETE CASCADE
)
GO
CREATE TABLE OrderDetails(
OrderID int not null,
PartNo varchar(10) not null,
Description varchar(25) not null,
UnitPrice money not null,
Qty int not null,
CONSTRAINT PK_OrderDetails--关系名称
PRIMARY KEY (OrderID,PartNo),--创建两个主键
CONSTRAINT PK_OrderContainsDetails--关系名称
FOREIGN KEY (OrderID)--外键列
REFERENCES Orders(Id_O)--外键列的引用来自
--联级设置
ON UPDATE NO ACTION
ON DELETE CASCADE
)
GO
删除表的所有内容
语句 TRUNCATE TABLE name
注意:查看约束语句 EXEC sp_helpconstraint Products唯一约束
定义:类中的值必须是唯一的案例:1.创建表时,创建唯一约束USE Test1 CREATE TABLE Shippers( ShippersId int IDENTITY NOT NULL primary key, ShipperName varchar(30) NOT NULL, Address varchar(30) NOT NULL, City varchar(25) NOT NULL, State char(2) NOT NULL, Zip varchar(10) NOT NULL, PhoneNo varchar(14) NOT NULL UNIQUE )2.在已有的表中创建唯一约束ALTER TABLE Products ADD CONSTRAINT AK_EmployeeSSH UNIQUE (ProductID);
CHECK约束
定义:不限定与一列可以和表关联,也可以和列关联,可以使用WHERE 子句一样的规则来定义CHECK约束。
案例:1.给已存在的表添加CHECK约束
ALTER TABLE Customers ADD CONSTRAINT CN_CustmoerAgeInSystem CHECK (Age<=120)
DEFAULT约束
定义:default约束是一个字面量,例如(设置默认薪水为0,或者设置字符串的列为“UNKNOWN”),或者某个系统值为(如:GETDATE())
注意:
1.只能在INSERT语句中使用,在UPDATE语句和DELETE语句中被忽略。
2.如果在INSERT语句中提供了任意值,就不适用默认值。
3.如果没有提供值,那么总是使用默认值。
案例:
1.创建表格时设置字段默认
CREATE TABLE Shipper(
ShipperID int IDENTITY NOT NULL PRIMARY KEY,
ShipperName varchar(30) NOT NULL,
DateInSystem DateTime NOT NULL DEFAULT GETDATE()
);
ShipperID int IDENTITY NOT NULL PRIMARY KEY,
ShipperName varchar(30) NOT NULL,
DateInSystem DateTime NOT NULL DEFAULT GETDATE()
);
2.在已存在的表中添加默认字段
ALTER TABLE TestA
ADD CONSTRAINT CN_TestAAge DEFAULT 150 FOR height;
ADD CONSTRAINT CN_TestAAge DEFAULT 150 FOR height;
禁用约束
定义:禁止使用约束,但是SQLServer 只允许禁用外键约束或者CHECK约束。(不能禁止主键约束和外键约束)
例子:
1.在已有数据的字段中添加约束,如何解决原来表列原来的数据与新添加约束的冲突问题。
ALTER TABLE Customer 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][0-9]');
出现冲突错误
解决冲突
ALTER TABLE Customer
WITH NOCHECK//表示对表中原有的数据不进行检查
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][0-9]');
WITH NOCHECK//表示对表中原有的数据不进行检查
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][0-9]');
2.重新启用约束
ALTER TABLE Customer
CHECK
CONSTRAINT CN_CustomerPhoneNo;
CHECK
CONSTRAINT CN_CustomerPhoneNo;
规则和默认值
规则
定义:规则和Check约束非常相似。他们之间的唯一区别是规则每次只能作用于一个列。
创建规则:
CREATE RULE Products AS @UnitPrice >0;
删除规则:
DROP RULE 规则名
DROP RULE 规则名
默认值
定义:与DEFAULT约束类似,区别在于它们被追加到表中的方式和对用户自定义数据类型的默认值(是对象,而不是约束)的支持。
语法:CREATE DEFAULT 列名 AS 默认值
案例:
1.创建默认值:
CREATE DEFAULT price AS 0;
2.默认值要绑定到对象才有用,否则默认值不起作用:
EXEC sp_bindefault 'price','bbb.price';
3.删除默认值:
DROP DEFAULT price;
4.确定那些表和数据类型使用给定的规则和默认值
EXEC sp_depends price;