一、通过sql命令建表和主外键约束
create table dept
(
dept_id int primary key,
dept_name nvarchar(100) not null,
dept_address nvarchar(100)
)
create table tmp
(
emp_id int constraint pk_id_haha primary key,
emp_name nvarchar(20) not null,
emp_sex nchar(1),
dept_id int constraint fk_dept_id_heihei foreign key references dept(dept_id),
)
【1】关于主键与类型写法
- 可以在定义主键的同时指定主键的名字,任何一个约束都有一个名字,不指定的话会有一个默认的名字
- C语言是先写类型再写名字,这里刚好相反,因为数据库不是源自于C语言
【2】关于nvarchar(20) not null :
- n表示国际化的编码,var表示的是变量,char表示字符类型
- 整体表示:可以支持汉字的,字符长度是随着输入的字符长度变化的类型。
- 后面的20表示字符长度最大为20个。
- 如果存储的类型是汉字,就必须加上n,否则可能会出问题
- 如果不允许为空,则写not null
【3】关于nchar(1) :
- 由于性别只有男和女,因此只需要1个字符
- 同时由于是汉字,因此前面加上n
【4】关于最后一个变量后面是否可以加逗号:
- 注:在SQL Server里面逗号写不写都可以,但是在oracle里面最后不能写逗号,否则报错
删除banji表
drop table banji
二、详细阐述主外键约束的作用
什么是约束: 【1】定义:对一个表中的属性操作的限制叫做约束 【2】分类:
- 主键约束:不允许重复元素,避免了数据的冗余
- 外键约束:通过外键约束,从语法上面保证了本事物所关联的其他事物一定是存在的。
- 事物和事物之间的关系是通过外键来体现的
三、check约束及其作用
check约束:保证事物的取值在合法的范围之内。
create table student
(
stu_id int primary key,
stu_sal int check (stu_sal>1000 and stu_sal<8000)
)
向student表添加数据:
insert into student values(1,500)
四、default约束及其作用
【1】default
default约束:保证事物的属性一定会有一个值。
create table student1
(
stu_id int primary key,
stu_sal int check (stu_sal>=1000 and stu_sal<=8000),
stu_sex nchar(1) default('男')
)
插入一条数据,但是没有对性别赋值,由于default的作用,因此会自动赋值为男
insert into student1(stu_id,stu_sal) values(1,5000)
数据库里面的单引号和双引号的区别:
- 单引号:用来标识字符串
- 双引号:用来模拟一个对象的名字,比如表,约束等的名字
- 如果为某一个事物起名字,则使用双引号,表示字符串则使用单引号
insert into student1(stu_id,stu_sal) values(1,5000)
insert into student1 values (2,6000,'女')
insert into student1 values (3,6000)
【1】null与default的区别
【1】相同点:都允许用户不赋值 【2】不同点:
- null修饰的字段如果用户不赋值,则默认为NULL
- default修饰的字段如果用户不赋值则默认为default指定的那个值
【3】null表示空,与0不同
五、唯一约束及其作用
唯一约束:保证了事物属性的取值不允许重复,但允许为空值
create table student2
(
stu_id int primary key,
stu_sal int check (stu_sal>=1000 and stu_sal<=8000),
stu_sex nchar(1) default('男'),
stu_name nvarchar(200) unique
)
insert into student2 values (1,6000,'女','张三')
insert into student2 values (2,6000,'女','张三')
主键和唯一约束的区别: 【1】主键不能有空值,唯一键可以有空值,但只能有唯一一个空值
unique和not null可以一起使用,这样就保证了唯一且不为空值:
【1】not null
not null :
【1】表示非空,则必须为属性赋值
【2】如果一个字段没有写not null也没有写null,则默认该属性能够为空,不会报错
【3】如果没有写not null,也没有为该字段赋值,则该字段默认值为NULL
【2】identity
关于identity: identity表示该字段的值会自动更新,不需要我们维护,通常情况下我们不可以直接给identity修饰的字符赋值,否则编译时会报错
create table student2
(
sid int primary key identity(20,5),
sname nchar(8) not null,
ssex nchar(1)
)
insert into student2(sname,ssex) values ('张三','男');
insert into student2 values ('李四','女');
insert into student2 values ('王五','女');
六、表,约束和关系
- 表和约束的区别:
【1】数据库是通过表来解决事物的存储问题
【2】数据库通过约束来解决事物取值的有效性和合法性问题
【3】建表的过程就是指定事物属性及其事物属性各种约束的过程
- 什么是关系
【1】定义:表与表之间的联系
【2】实现方式:通过设置不同形式的外键来体现表和表之间的不同关系
- 分类
【1】一对一
既可以把表A的主键当成表B的外键 也可以把表B的主键当成表A的外键
【2】一对多
把表A的主键充当表B的外键(在多的一方添加外键)
【3】多对多
一对一或者一对多可以在某一张表上面添加外键的方式来实现,而多对多则必须通过一张表来实现。即多对多必须通过C表来体现A表和B表的关系。
创建上面图中显示的三张表:
create table banji
(
banji_id int primary key,
banji_num int not null,
banji_name nvarchar(100)
)
create table jiaoshi
(
jiaoshi_id int primary key,
jiaoshi_name nvarchar(100)
)
create table jiaoshi_banji_mapping
(
banji_id int constraint fk_banji_id foreign key references banji(banji_id),
jiaoshi_id int foreign key references jiaoshi(jiaoshi_id),
kecheng nvarchar(20),
constraint pk_banji_id_jiaoshi_id primary key (banji_id,jiaoshi_id)
)
|