1.约束
约束的作⽤:对表中的数据进⾏限制,保证数据的正确性、有效性和完整性。⼀个表如果添加了约束,不正确 的数据将⽆法插⼊到表中。约束在创建表的时候添加⽐较合适。
1.1主键约束:在添加数据时,约束重复数据的行为,需要一个字段保证数据是唯一的,所以这个字段的值是不能为null的
特点:非空且唯一
分类:
自然主键:数据中本身存在一个非空并且唯一的字段 -- 不建议使用
代理主键:字段和数据没有直接联系 id
int(6) - 自动增长(mysql自带特性) - 序列(oracle特性 sequence)
varchar(32) - UUID() 【java中也有UUID.randomUUID】
-- UUID()会产生“-”,可以用replace去掉
select replace(UUID(),"-","");
添加方式:
-- 表存在
alter table user add primary key(id); -- 保证添加主键的字段非空且唯一
-- 创建表时添加主键
1.int型主键
create table user(
id int(6) primary key auto_increment,
username varchar(20)
);
insert into user values (1,'lucy');-- 手动指定id
insert into user values (null , 'jack');-- 自动增长的序列才能null
-- 设置了自动增长的主键,自动增长的特性是删不掉的
truncate user2;
insert into user2 values (null,'jack');
alter table user2 drop primary key;-- 报错
2.字符串型主键
create table user3(
id int(6) ,
username varchar(32)primary key -- 当字符串为主键时
);
insert into user3 values (1,'lucy'); -- 手动指定
insert into user3 values (1,replace(UUID(),'-',''));-- 使用UUID()自动生成主键
1.2唯一性约束
-- 唯一性约束unique
-- 自动在这一列中生成索引 - index
-- 在已有的表中添加唯一约束 user2-username
alter table user2 add unique (username);
show index from user2;
-- 在已有的表中删除唯一索引
alter table user2 drop index username;
show index from user2;
1.3非空约束
-- 非空约束
-- 添加非空约束
alter table user3 add password varchar(20) not null default '12345';
insert into user3(id,username) values (2,replace(UUID(),'-','')); -- password自动填写‘12345’
-- 删除非空约束
alter table user3 modify password varchar(20);
insert into user3 (id, username) VALUES (3,replace(UUID(),'-',''));-- password可为null
1.4外键约束
什么是外键:在从表中与主表主键对应的那⼀列,如:员⼯表中的 dep_id
主表:⼀⽅,⽤来约束别⼈的表
从表:多⽅,被别⼈约束的表
-- 2) 创建从表employee并添加外键约束emp_depid_fk
-- 多⽅,从表
create table employee(
id int primary key auto_increment,
name varchar(20),
age int,
dep_id int, -- 外键对应主表的主键
-- 创建外键约束
constraint emp_depid_fk foreign key (dep_id) references
department(id)
);
1.5.表与表之间的关系
1.5.1⼀对多
⼀对多(1:n)例如:班级和学⽣,部⻔和员⼯,客户和订单,分类和商品
⼀对多建表原则:在从表(多⽅)创建⼀个字段,字段作为外键指向主表(⼀⽅)的主键
1.5.2多对多
多对多(m:n)例如:⽼师和学⽣,学⽣和课程,⽤户和⻆⾊
多对多关系建表原则:需要创建第三张表,中间表中⾄少两个字段,这两个字段分别作为外键指向各⾃⼀⽅的主键。
create table student (
sid int,
sname varchar(20)
);
create table course(
cid int,
cname varchar(20)
);
create table relation(
sid int,
cid int
); -- 创建三个表
insert into student values (1,'张三'),
(2,'李四'),
(3,'王五');
insert into course values (1,'语文'),
(2,'数学'),
(3,'英语');
alter table student add primary key (sid); -- 设置主键
alter table course add primary key (cid);
alter table relation add constraint s_id_fk foreign key (sid)
references student (sid);
alter table relation add constraint c_id_fk foreign key (cid)
references course (cid);-- 设置外键
insert into relation values (1,1),(1,2),(1,3),(2,3),(3,1),(3,3);
1.5.3一对一