SQL主键和约束
SQL主键和约束
主键
1.工具创建表 列 数据类型 是否null
一个表中,会存很多条记录,需要一个列来唯一标识一条数据。
主键:唯一标识一条数据。值 不能重复 不能为空
什么样的列可以设置为主键:值 不能重复 不能为空
什么叫标识列?一个列设置成标识列,它就不能再手动插入,插入时,自动生成的。
这个列,类型必须是不带小数的数值型 整型
标识列:标识种子 第一条记录标识列的值 100 增量 3
删除了数据,再插入,就会出现不连续 缺点
主键的特点【重点】
含有主键的表叫做主键表
主键通常都是整数不建议使用字符串当主键(如果主键是用于集群式服务,才可以考虑用字符串当主键)
主键的值通常都不允许修改,除非本记录被删除
主键不要定义成id,而要定义成表名Id或者表名_id
要用代理主键,不要用业务主键
任何一张表,强烈建议不要使用有业务含义的字段充当主键
我们通常都是在表中单独添加一个整型的编号充当主键字段
主键是否连续增长不是十分重要
2.创建主键 联合主键 唯一标识
创建一个主键,同时自动创建了一个聚集索引
3.创建外键
外键:一般在两个表之间要建立关联时候,创建
一个列创建为外键,它在另一个表必须是主键
外键:DeptId UserInfos 外键表
DeptInfos 主键表
两个表一旦建立外键关系,外键表里的对应的外键列,它的值必须是它对应的主键表里的主键值,不如果你想插入一个不存在 的值,你是插入不进去的。
一个表里可以有多个外键,也可以没有,一个表只能有一个主键,也可以没主键,但一般都会设置一个主键。
问题:先删主键表还是外键表?
答:先删外键表。如果先删主键表,会报错,因为这会导致外键表中的数据引用失败。
约束
-
约束定义:规定表中的数据规则。如果存在违反约束的数据行为,行为就会被阻止。
在什么时候可以创建约束呢?使用软件创建,创建表之后, 使用脚本创建表:可以在创建的过程中,也可以在创建后再来建立约束。
2. 分类
主键 Primary Key约束:唯一性、非空,不能修改。
-
defaut:为默认值约束的关键字,用于指定其后的default_expression 为默认值表达式 。
-
identity:[(seed,increment)] 表示该列为标识列或称自动编号列。
-
constraint constraint_name 为可选项,关键字constraint用于指定其后面的约束名称constraint_name。如省略本选项,则系统自动会给出一个约束名。建议选择约束名以便于识别。
-
primary key:表示该列具有主键约束。
-
clustered | nonclustered 表示建立聚簇索引和非聚簇索引,省略此选项默认为聚簇选项。
外键 Foreign Key约束:加强两个表的一列或多列数据之间的连接的。先建立主表的主键,然后再定义从表中的外键。只有主表中的主键才能被从表用来作为外键使用。主表限制了从表更新和插入的操作。当删除主表中的某条数据,应该是先删除从表中相关的数据,再删除主表。
创建外键约束格式:
Unique约束 唯一性约束:确保表中的一列数据没有相同的值。与主键约束相似,但又不同。主键只能有一个,但一个表中可以定义多个唯一约束。唯一键可以为NULL,但主键不可以。
Check约束:通过逻辑表达式来判断数据的有效性,用来限制输入一列或多列的值的范围。
Default约束:默认值约束。用户在插入新的数据行时,如果该行没有指定数据,那么系统将默认值赋给该列,如果没有设置默认值,系统就会默认为NULL。
Not Null : 非空性约束
3、表和约束的异同
-
数据库是通过表来解决事物的存储问题的
-
数据库是通过约束来解决事物取值的有效性和合法性的问题
-
建表的过程就是指定事物属性及其事物属性各种约束的过程
4、primary key 约束与unique 约束的主要区别:
-
一个数据表只能创建一个primary key 约束,但一个表中可根据需要对不同的列创建若干个unique 约束。
-
primary key 字段的值不允许为NULL,而unique字段的值可取NULL.
-
一般创建primary key约束时,系统会自动产生索引,索引的默认类型为聚簇索引。创建unique 约束时,系统会自动产生一个unique索引,索引的默认类型为非聚簇索引。
相同点:
-
二者均不允许表中对应字段存在重复值。
-
二者均自动创建一个唯一索引
语法格式
1.在创建表的过程中创建约束
unique
主键约束 外键约束 unique约束(唯一约束) check约束 default约束 default('')
primary key foreign key references 主表名(主键列名)
2.在创建表完成后再创建约束
alter table 表名 add constraint 约束名
primary key (列名) /
foreign key(列名) references 主表(列名)/
unique (列名)/
check(逻辑表达式)
default(缺省值) for 列名
3、设置主键约束
语法:
CONSTRAINT constraint_name PRIMARY KEY ( column_name )
例子:
create table mysc
(sno char(4) not null,
cno char(10) not null,
grade tinyint)
alter table mysc
add constraint mysc_pk
primary key (sno,cno)
alter table mysc
drop constraint mysc_pk
4. 设置唯一性约束
语法:
CONSTRAINT constraint_name UNIQUE ( column_name )
例子:
create table 雇员表
(雇员号 char(10) primary key,
雇员名 nvarchar(8) unique
)
alter table student
add constraint uk_sname_s
unique (sname)
select * from student
with (index=uk_sname_s)
alter table student
drop constraint uk_sname_s
5. 外键约束
语法:
CONSTRAINT constraint_name FOREIGN KEY(column_name[,…n])REFERENCES ref_table [(ref_column[,…n])]
例子:
create table xs
(sno char(10) primary key)
create table xs_kc
(sno char(10),
cno char(4),
grade tinyint,
foreign key (sno) references xs(sno)
on update cascade
on delete cascade
)
create table kc
(cno char(4) primary key,
cname nvarchar(20),
cpno char(4),
credit tinyint)
alter table xs_kc
add constraint kc_foreign
foreign key (cno) references kc(cno)
alter table xs_kc
drop constraint kc_foreign
6. Check 约束:
例子:
alter table xs
add ssex char(2)
constraint sex_ck
check(ssex in ('男','女'))
alter table xs_kc
drop constraint sex_ck
alter table xs_kc
add constraint grade_ck
check(grade>=0 and grade<=750)
alter table xs_kc
drop constraint grade_ck
7. 默认约束default
格式:
CONSTRAINT constraint_name DEFAULT constraint_expression [FOR column_name]
例子:
create table mystudent2
(sno char(10),
sname nvarchar(4),
ssex char(2),
sdept nvarchar(10)
constraint sdept_defa
default ('计算机科学'),
scomegrade smallint
constraint cg_ck
check (scomegrade>=0 and scomegrade<=750)
)
create table stu
(sno char(10),
sname varchar(8),
ssex char(2)
constraint sex_ck
check (ssex in ('男','女')),
sdept varchar(20)
constraint sdept_defa1
default ('计算机科学')
use TestBase
go
--创建表
create table ProductInfos
(
Id int identity(1001,1) primary key not null, --标识种子,增量
ProNo varchar(50) unique not null,
ProName nvarchar(20) not null,
TypeId int not null foreign key references ProductType(TypeId) ,
Price decimal(18,2) check(Price<10000) default (0.00) not null,
ProCount int default (0) null,
)
go
--删除表
drop table ProductInfos
go
--在建表完成后,创建约束
create table ProductInfos
(
Id int identity(1001,1) not null, --标识种子,增量
ProNo varchar(50) not null,
ProName nvarchar(20) not null,
TypeId int not null ,
Price decimal(18,2) not null,
ProCount int null
)
go
--主键 Id
alter table ProductInfos add constraint PK_ProductInfos primary key(Id)
--外键 TypeId
alter table ProductInfos add constraint FK_ProductInfos foreign key (TypeId) references ProductType(TypeId)
--unique约束 ProNo