use Test1
go
create table tb_person
(
id int identity(1,1) primary key not null, --要把该列设置为主键列就用 primary key --
name varchar(20) not null,
sex char(2) not null,
cardid char(25) not null, -- 身份证编号--
age int not null,
currenttime datetime not null,
ksid int not null,
jg varchar(20),
sf varchar(10) null,
city varchar(20) null default '成都', --在添加列的时候可以给添加默认值
address varchar(100) null,
docid int null,
)--使用语法创建表--




--添加主键约束--


alter table tb_person
add constraint PK_pid primary key (id) --主键约束用PK_....
go


--检查约束 一定是返回为true或false的表达结果--
alter table tb_person
add constraint CK_age check (age < 150 and age >0) --比如查询年龄不能大于150岁 ,小于0岁 关键字and--  --检查约束用CK_....


alter table tb_person with nocheck
add constraint CK_SEX Check(sex = '男' or sex ='女')--检查性别只能两种 男,或者 女, 关键字 or
go


--唯一性约束,表示该列的值是唯一的--
alter table tb_person
add constraint UQ_CardId unique(cardid)   --唯一性约束用UQ_....
go


--添加的是默认约束--


alter table tb_person
add constraint DK_Address default('地址不详') for address  --默认约束用DK_....
go


--添加外键约束,保证在我们在引用别的表的数据的时候,该数据在其他表示存在的--


alter table tb_person
add constraint FK_KSID foreign key (ksid) references tb_ks(ksid)  --外键约束用FK_....
go


 --如果我们在添加约束之前,都已经存在了数据,而这个数据不符合我们的外键约束
 --解决方法:
 --1)删除之前的数据(不推荐)
 --2)在创建约束的时候,告诉系统不再检查之间的数据。 with nocheck
 -- 语法如下:
alter table tb_person with nocheck
add constraint FK_KSID foreign key (ksid) references tb_ks(ksid)  --外键约束用FK_....
go

alter table tb_person with nocheck
add constraint FK_DOCID foreign key(docid) references tb_doc(docid)
go 


--在数据库中查看约束--
--name表示约束的名称--
select *from sysobjects where name='ck_age'


--在数据库中删除约束,比如删除上面的年龄--
alter table tb_person
drop constraint ck_age
go


--新增表的字段--
--对表重新添加一列--
alter table tb_doc
add docage int not null default 30
go


--建议在创建表之后就立马把外键约束创建好










规则:
--规则是一个向后兼容的功能,用于执行一些 CHECK 约束相同的功能。
--CHECK约束是用来限制列值的首选标准方法。
--CHECK约束比规则更简明,一个列只能应用一个规则,但是却可以应用多个 CHECK 约束。
--CHECK约束作为 CREATE TABLE 语句的一部分进行制定,而规则以单独的对象创建,然后绑定到列上。
--     区别:约束只能正对单表。而规则可以正对多张表。





--规则的使用方法
--1)   对年龄做一个规则的语法--      
--注意在TSQL中变量钱要加@符号
--create rule  规则名字 规则变量 变量的值的范围
--例如:
create rule agerule as @ageid between 1 and 150   
go


--2)把这个规则应用某个表中
--需要调用系统内置的存储过程
-- sp_bindrule 第一个参数表示规则的名字,第二个参数制定所限制的列名(表名.列名)
--例如:
exec sp_bindrule 'agerule','tb_person.age'
go




--另外:在sql server 取数据库服务器的系统时间。取系统时间的函数:getdate()  时间的类型 datetime