约束:对一个表中属性操作的限制
项目 | Value |
---|---|
主键 ( P K ) (PK) (PK)约束 | 不允许重复元素,避免数据冗余 |
外键 ( F K ) (FK) (FK)约束 | 从语法上保证了本事物所关联的其他事物一定存在 |
c h e c k check check约束 | 保证事物的属性在合法的范围内 |
d e f a u l t default default约束 | 保证事物的属性一定会有一个值 |
u n i q u e unique unique唯一性约束 | 不允许重复,但允许为空, S Q L S e r v e r SQLServer SQLServer不允许多列为空 |
- 事物和事物之间的关联由外键体现
- 外键不能来自另一个表的普通键,如果是普通键则可以一致,如果有重复的就无法判断来自于哪一个。
- 不要用业务逻辑当主键,比如用户名,因为用户名可以改,加一些额外的操作,比如重新编个号。
- 外键可以有多个,主键只可以有一个
下面建一个简单的学生表,快跟着敲一遍:
数据库中单引号里面是字符串,双引号里是数据的名字
我们会遇到这样的问题,老代码运行完后新代码加进去会报错,显示已存在
IF OBJECT_ID('student') IS NOT NULL
DROP TABLE student
- n o t n u l l not\,\, null notnull:默认 n u l l null null,用户不给该字段赋值,则字段默认值为 n u l l null null
create table dept2
(
dept2_id int primary key,
dept2_name nvarchar(100) not null,
dept2_address nvarchar(100)
)
create table emp2
(--不能写成{
emp2_id int constraint pk_id_hahaha primary key,--定义主键同时定义了名字
emp2_name nvarchar(20) not null ,
--n表示国际化支持汉字,vary变量,char表示字符,(20)最大20个
emp2_sex nchar(1),
dept2_id int constraint fk_dept_id_heihei foreign key references dept2(dept2_id),--列名,类型,约束,约束的名字,外键约束,外键是哪个表的
)
IF OBJECT_ID('student') IS NOT NULL
DROP TABLE student
create table student
(
student_id int primary key,
student_sal int check (student_sal>1000 and student_sal<8000),
student_sex nvarchar(2) default('男'),
student_name nvarchar(200) unique
)
insert into student(student_id,student_sal,student_name) values (1,2000,'王五');
insert into student values (2,4000,'女','张三')
insert into student values (3,6000,'男','李四');
和约束的关系
黄金三句:
分类 | Value |
---|---|
一对一 | 即可以把表A的主键充当B的外键,也可以把表B的主键充当表A的外键 |
一对多 | 把表A的主键添加到表B来充当外键,或者说在多的一方添加外键 |
多对多 | 必须通过单独的一张表来表示 |
建立班级,学生,课程的具有多对多关系的表:
班级一张表,教师一张表,班级和教师的关系也是一张表。
功能 | 操作 | 图例 |
---|---|---|
约束及约束的命名 | c o n s t r a i n t + 命 名 constraint\,\, +命名 constraint+命名 | |
外键及来源表格 | f o r e i g n k e y r e f e r e n c e s foreign\,\, key\,\, references foreignkeyreferences |
--班级表
create table class
(
class_id int primary key,
class_num int not null,
class_name nvarchar(100)
)
--教师
create table teacher
(
teacher_id int primary key,
teacher_name nvarchar(200)
)
drop table class_teacher_mapping--没写完可以加这句话
--第三张表格,来模拟班级和教师的关系
create table class_teacher_mapping
(class_id int constraint fk_class_id foreign key references class(class_id),
teacher_id int foreign key references teacher(teacher_id),
course nvarchar(20),
constraint pk_class_id_teacher_id primary key (class_id,teacher_id,course)
)
- 主键:能唯一标识事物的一个字段,主键不允许修改,修改可能会出现重复。
- 主键通常是整数,不建议用字符串(如果主键是用于集群式服务,才可以用字符串)
- 主键通常 不允许修改,除非被本记录删除
- 主键不要定义成 i d id id,而要定义成表名 I d Id Id或者表名_id
- 要用代理主键,不要用业务主键,通常都是单独添加一个整型的编号充当主键字段
- 先删外键表,否则会报错
SQL Server零基础学起你必会(一)图形化界面建表
SQL Server零基础学起你必会(二)表和约束概念详解,用SQL命令建表和约束
SQL Server零基础学起你必会(三)九种简单查询【史上最全】
数据库入门(一)范式理解:1NF,2NF,3NF,BCNF,4NF详析
数据库 SQLServer 视频教程全集(99P)| 22 小时从入门到精通
数据库知识点
一个小时上手SQL
sql语句,你肯定会听懂的
(重要顺序从上到下)