完整性
完整性
4.1实体完整性
4.1.1主键约束 PRIMARY KEY
主键约束在表中定义一个主键来唯一确定表中一行数据的标识符,主键列的数据类型不限,但列必须唯一并且非空。一个表只允许一个主键,主键可以是单个字段或多个字段的组合。
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。use test
go
create table tb(
--单列主键的创建
id int primary key
)
go
create table tb1(
id int,
name varchar(50),
--多列组合的主键
CONSTRAINT tb1_id_name_pk PRIMARY KEY(id,name)
)
Go
--为表添加主键
alter table table_name
add
constraint pk_name
primary key(column_name)
--删除主键
alter table table_name
drop
constraint pk_name
4.1.2唯一性约束 UNIQUE
--防止非主键重复
CREATE TABLE Persons
(
Id_P int NOT NULL UNIQUE,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
--多字段
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
)
--添加
ALTER TABLE Persons
ADD UNIQUE (Id_P)
--添加
ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
--删除
ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID
4.1.3标识 IDENTITY
自动编号
CREATE TABLE table_name(
id int IDENTITY(1,1),
NAME nvarchar(50) not null,
sex char(2) default '男',
note ntext null
)
4.1.4外键约束 FOREIGN KEY
指定必须存在值得列,定义值与同一个表或另一个表的主键值匹配的一列或多列组合
--创建表时添加外键
create table table_name(
id int primary key,
id1 int foreign key )
--已有表添加约束
alter table table_name
add
constraint fk_name
foreign key(columne_name)
--删除外键
alter table table_name
drop
constraint fk_name
4.2值域完整性
4.2.1数据类型
--数字数据类型tinyint,smallint,int,bigint,bit,decimal,numeric,money,smallmoney,float,real
--字符数据类型非Unicode字符数据类型char,varchar,text;Unicode字符数据类型nchar,nvarchar,ntext
--二进制数据类型binary,varbinary,image
--日期和时间date,time,datetime2,datetimeoffset
--空间数据类型平面空间数据类型(geometry)地理空间数据类型(geography)
--hierarchyid数据类型
--sql_variant,timestamp,uniqueidentifier,xml
--自定义数据类型
exec sp_addtype cellphone,'nchar(11)','null'
exec sp_droptype cellphone
--DATE数据类型只输出日期
declare @dt date
set @dt=getdate()
print @dt
--TIME数据类型只输出时间
declare @tm time
set @tm=getdate()
print @tm
--DATETIME2数据类型输出日期时间及有可变精确度的秒
declare @tm2 datetime2(6)
set @tm2=getdate()
print @tm2
--DATETIMEOFFSET数据类型时区区分
declare @dtos1 datetimeoffset(0)
set @dtos1= '2007-12-04 21:20:30 -1:00'
declare @dtos2 datetimeoffset(0)
set @dtos2= '2007-12-04 21:20:30 +5:00'
select datediff(hh,@dtos1,@dtos2)
4.2.2默认值约束 DEFAULT
CREATE TABLE table_name(
id int IDENTITY(1,1),
NAME nvarchar(50) not null,
sex char(2) default '男',
note ntext null
)
指定列的默认值
--创建一个默认值对象
create default sdept_char
as '信息中心'
go
--为表sdept列绑定默认值
sp_bindefault sdept_char,'student.sdept'
--测试绑定的默认值
insert student(sno,sname,ssex) values('001','类鳄梨','男')
select * from student where sno='001'
--取消默认值绑定
sp_unbindefault 'student.sdept'
--测试取消是否成功
insert student(sno,sname,ssex) values('002','雷海鸣','男')
select * from student
--删除默认值对像
drop default sdept_char
4.2.3检查约束 CHECK
指定列的允许值,指定根据同一个表中其他列的值可在列中接受的数据值
--为表年龄字段添加约束
alter table student
add constraint ck_sage check(sage>=0 and sage<=100)
--测试约束
update student set sage=102 where sno=001
--删除表年龄字段约束
alter table student
drop constraint ck_sage
--测试
update student set sage=102 where sno=001
4.2.4非空约束NOT NULL
指定是否允许为NULL字符
CREATE TABLE table_name(
id int IDENTITY(1,1),
NAME nvarchar(50) not null,
sex char(2) default '男',
note ntext null
)
4.2.5规则 RULE
--创建规则对象
create rule format
as
@联系电话 like '[0][1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
--修改表添加列
alter table student
add telephone char(12)
--为列绑定规则
sp_bindrule format,'student.telephone'
--测试绑定规则
update student set telephone='00001234567' where sno='001'
update student set telephone='01001234567' where sno='002'
select * from student
--解除绑定规则
sp_unbindrule 'student.telephone'
--测试解除
update student set telephone='00001234567' where sno='001'
select * from student
--删除规则对象
drop rule format
