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 myscadd constraint mysc_pkprimary key (sno,cno)alter table myscdrop constraint mysc_pk
4. 设置唯一性约束
语法:
CONSTRAINT constraint_name UNIQUE ( column_name )
例子:
create table 雇员表(雇员号 char(10) primary key,雇员名 nvarchar(8) unique)alter table studentadd constraint uk_sname_sunique (sname)select * from studentwith (index=uk_sname_s)alter table studentdrop 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 cascadeon delete cascade)create table kc(cno char(4) primary key,cname nvarchar(20),cpno char(4),credit tinyint)alter table xs_kcadd constraint kc_foreignforeign key (cno) references kc(cno)alter table xs_kcdrop constraint kc_foreign
6. Check 约束:
例子:
alter table xsadd ssex char(2)constraint sex_ckcheck(ssex in ('男','女'))alter table xs_kcdrop constraint sex_ckalter table xs_kcadd constraint grade_ckcheck(grade>=0 and grade<=750)alter table xs_kcdrop 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_defadefault ('计算机科学'),scomegrade smallintconstraint cg_ckcheck (scomegrade>=0 and scomegrade<=750))create table stu(sno char(10),sname varchar(8),ssex char(2)constraint sex_ckcheck (ssex in ('男','女')),sdept varchar(20)constraint sdept_defa1default ('计算机科学')
use TestBasego--创建表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 ProductInfosgo--在建表完成后,创建约束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--主键 Idalter table ProductInfos add constraint PK_ProductInfos primary key(Id)--外键 TypeIdalter table ProductInfos add constraint FK_ProductInfos foreign key (TypeId) references ProductType(TypeId)--unique约束 ProNo