主键的特点
- 非空
- 唯一
- 被引用
- 当一张表的一列被设定为主键的时候那么,这一列就不能为空了,不能有重复的值出现
创建表的时候指定主键的两种方式
- 在创建字段后声明
create table hhh(
id int primary key,
name varchar(2)
);
- 在表格创建最后指定
create table hhh(
id int,
name varchar(2),
primary key(id)
)
在修改表的时候声明主键
alter table 表格名 add/modify/change … primary key;
删除主键
- alter table 表格名 drop primary key;
- 使用这种方式可以删除表格中的主键,不许要指定那一列是主键,系统会自动寻找
- 这种方式只是删除了主键不会删除主键所在的字段
设置主键自增长
- 因为主键的非空,必须唯一,通常指定主键的类型是整形,然后设置它自动增长,这样可以保证主键的唯一性,和非空性
设置主键自增长的方法
- 创建表的时候指定主键和主键自增长
create table hhh(
id int primary key auto_increment,
name varchar(30)
)
- 修改表的时候创建主键自增长
alter table hhh
change id id int auto_increment;
- 修改表的时候删除主键自增长
alter table hhh
change id id int;
==注意== - 当设置了自动增长的时候,那么不需要插入这一列的值,因为 系统会自动的插入
- 但是如果,自己指定了这个自动增长的值,那么就随着自己设置的值,进行增加
- 主键和外键的名字最好是相同的,这样可以方便自然内部查询。
设置非空约束
- 如果想要让某些值不能为空,那么可以设置为非空约束
如下,对name设置了非空约束
alter table hhh( id int primary key auto_increment, name varchar(10) not null )
- 如果删除了其中的一个元素,那么原来的哪一列值不变。
==注意==
- 如果已经存在数据表新的添加的一列,并且设置了非空约束,那么,旧的数据中的这一类的数据默认是int 是0 ,char 是 “”空字符串,boolean 是0填充
- 设置之后再次插入数据的话,那么就必须指定
唯一键
- 唯一约束的效果,不能重复
- 设置唯一键
create table wode(
id int primary key auto_inscrement,
name varchar(23) unique;
)
- 这样就个字段name设置了唯一约束
关系模型理解外键约束
关系模型
- 当我们做一个软件系统的时候,会有很多的实体,这些实体就是一个一个的类,
那么这些 类之间很有可能是存在关系的,比如:学校内存在学生,老师,这样就是一个一对多的关系
class Shoole { private Student stu; private Teacher tea; }
- 有或者,一个丈夫对应一个妻子,那么这就是一个一对一的关系
- 当然,一个员工可能同属于不止一个部门,这样就是一个多对一的关系
- 关系模型中的对应关系都是对象
- 对于数据库中的外键约束和关系模型有很多的相似点
外键约束
- 外键必须是另一表的主键
- 外键可以重复
- 外键可以为空
==注意==
- 主键表也成为主表,外键表也成为从表
- 数据库表中也存在关系模型中的对应关系,不同的是
- 数据库中的对应关系是相对于主键,外键来讲的,
- 关系模型中的对应关系是相对于对象来说的。
创建外键约束
- 首先创建主键表,主键中的主键,被外键表的外键引用
create table department(
dept_name varchar(20),
budget int,
descript varchar(20),
primary key(dept_name)
);
- 创建外键表,外键表的外键引用了主键表的主键,这样就可以形成连接关系
create table course(
course_id varchar(20),
deptnames varchar(20),
credits int,
foreign key(deptnames) references department(dept_name));
- 如果要删除主外键引用的表,步骤是:
- 先要删除外键表
- 因为主键表被外键表所引用,如果直接删除主键表,那么外键表就会变成空引用
- 在删除主键表
==关联主外键表的时候注意事项==
- 外键表的外键关联的必须是主键表的主键
- 着两个列的名字可以不一样,但是类型必须完全相同(类型和类型数量),否则,会提示ERROR 1005 (HY000)错误
- 主键和外键的编码必须是一样的
- 指定主键表的列必须是存在的
主外键关系模型
一对一
create table dep ( name int, id int primary key);
将外键表的主键设置为外键,和主键表的主键关联
create table emp( name int primary key, sex int, foreign key(name) references dep(id));
将外键表中的外键设置为not null unique非空唯一
create table ddd( name int not null unique, sex int, foreign key(name) references dep(id)); Query OK, 0 rows affected (0.14 sec)
由于主键,唯一,非空,的特性,所以形成了一对一的关系
- 一对多
- 将外键表的一个非唯一的列设置为外键
主键表
create table department(
dept_name varchar(20),
budget int,
descript varchar(20),
primary key(dept_name)
);
外键表
create table course(
course_id varchar(20),
deptnames varchar(20),
credits int,
foreign key(deptnames) references department(dept_name));
- 将外键表的一个非唯一的列设置为外键
- 多对多
- 创建多个主键表
- 外键表的外键有多个,分别对应主键表的主键,这样就形成了多个主键表,对应多个外键
create table b(
ha int,
ba int,
ta int,
foreign key(ba) references dep(id),
foreign key(ta) references mep(id));
- 外键表中的外键ba,和ta分别对应两个主键表的主键,实现了多对多