用SQL建表和约束
create table dept
( dept_id int primary key,
dept_name nvarchar(20) not null,
dept_address nvarchar(100) not null
)
create table emp
( emp_id int constraint pk_emp_id_haha primarykey,
emp_name nvarchar(20) not null,
emp_sex nchar(1) not null,
dept_id int constraint fk_dept_id_heihei foreignkey referencesdept(dept_id)
)
3、什么是约束
定义
对一个表中属性操作的限制
分类
主键约束
不允许重复元素避免了数据的冗余
外键约束
通过外键约束从语法上保证了本事物所关联的其他事物一定是存在的
事物和事物之间的关系通过外键来体现
check约束
保证事物的取值在一个合法的范围之内
默认约束
保证事物的属性一定会有一个值
唯一约束
保证了事物属性的取值不允许重复,但允许其中有且只有一行为空,oracle可以允许多行 为空 (可以和not null组合使用)
notnull约束
要求用户必须为该属性赋一个值,否则语法出错
create table student
( stu_id int primary key,
stu_sal int check (stu_sal>=1000 and stu_sal<=8000),
stu_sex nchar(1) default ('男') --()可以省略数据库中字符串必须用''双引号用来模拟一个数据的名字如表的名字、列的名字
)
insert into student values (1,1000);
insert into student values (2,10000);
4、表和约束的区别
数据库是通过表来解决事物的存储问题的
数据库是通过约束来解决事物取值的有效性和合法性的
建表的过程就是指定事物属性及其事物属性各种约束的过程
5、什么是关系
定义:
表和表之间的联系
实现方式:
通过设置不同形式的外键
分类:(假设A表和B表)
一对一
关联的实体都共享同样的主键
其中一个实体通过外键关联到另外一个实体的主键
通过外键表来表示两个实体间的关系(通过一个单独的表实现)
库里面:把表A的主键充当表B的外键
把表B的主键充当表A的外键
一对多
把表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(200)
)
--第三张用来模拟班级和老师的关系
create tablebanji_jiaoshi_mapping
(banji_id int constraint fk_banji_id foreignkey referencesbanji(banji_id),
jiaoshi_id intconstraint fk_jiaoshi_id foreign key references jiaoshi(jiaoshi_id),
kecheng nvarchar(20),
constraintpk_banji_id_jiaoshi_id primary key(banji_id,jiaoshi_id,kecheng)
)
6、主键
能够唯一标识一个事物的一个字段或多个字段的组合称为主键
含有主键的表称为主键表
设计主键要注意的问题:
主键通常都是整数,不建议使用字符串当主键(如果主键用于集群式服务,才考虑用字符串当主键)
主键的值通常不允许修改,除非本记录被删除
主键不要定义成id,而要定义成表名id或表名_id
任何一张表建议不要使用有业务含义的字段充当主键,通常在表中添加一个整型的编号充当主键字段
7、外键
(来自、参考)
定义:
如果一个表中若干个字段是来自另一个表的主键或唯一键则这若干个字段就是外键
注意:
外键通常来自另外一个表的主键而不是唯一键,因为唯一键可能为null。
外键不一定来自另外的表,也可能来自本表的主键
含有外键的表叫外键表,外键字段来自的那一个表叫主键表。
问题:
先删主键表还是外键表?
先删外键表。如果先删主键表会报错,因为这会导致外键表引用数据失败。