约束条件 说明
primary key (PK) 标识该字段为该表的主键,唯一性,不为空 ;UNIQUE + NOT NULL
foreign key (FK) 标识该字段为该表的外键,实现表与表之间的关联
null 标识是否允许为空,默认为NULL。
not null 标识该字段不能为空,可以修改。
unique key (UK) 标识该字段的值是唯一的,可以为空,一个表中可以有多个unique key
auto_increment 标识该字段的值自动增长(整数类型,而且为主键)
default 为该字段设置默认值
unsigned 无符号,正数
主键,外键
1.什么是外键:外键的主要作用是保持数据的一致性、完整性。
2.什么是索引:索引相当于书中的目录,可以提高数据检索的效率,降低数据库的IO的压力。MySQL在300万条记录左右性能开始逐渐下降,虽然官方文档说500~800w记录,所以大数据量建立索引是非常有必要的
3.什么是行锁定与锁表:可以将一张表锁定和可以单独锁一行的记录。为了防止你在操作的同时也有别人在操作。
4.什么是事务:事务是由一步或几步数据库的操作。这系列操作要么全部执行,要么全部放弃执行。
1.主键约束 primary key
主键(Primary Key)和外键(Foreign Key)是两种重要的约束,它们用于维护数据的完整性和关系。
1.主键(Primary Key):
- 主键是表中用来唯一标识每一行记录的字段或字段组合。
- 一个表只能有一个主键。
- 主键的值必须是唯一的,不能有重复的值,也不能是NULL(除非表的设计允许)。
2.外键(Foreign Key):
- 外键是一个字段或字段组合,它在另一个表中作为主键存在。
- 外键用于建立两个表之间的链接,确保引用的数据的完整性。
- 一个表可以有多个外键,指向不同的表。
3.主键与外键的关系:
- 外键必须引用另一表的主键,确保数据的引用完整性。
- 当主键表中的数据被删除或更新时,外键表中的数据可以配置为级联更新(cascade update)或级联删除(cascsde delete),也可以设置为不进行级联操作,而是设置为set null或no action等。
- 外键的存在可以防止数据库中出现孤立的记录,即在引用表中存在没有对应主键的记录。
1.创建表时添加主键约束
create table test(id int, name char(20), age int, addr char(20),primary key(id));
#
create table test(id int primary key, name char(20), age int, addr char(20));
2.在现有表上添加主键约束:
alter table test add primary key(id);
3.删除主键:
alter table 表名 drop primary key;
2.外键约束 foreign Key
1.create table创建外键:
#子表的一个 parent_id字段 被设置为外键,引用了主表的parent_id字段。
create table 子表 (
child_id int,
parent_id int,
foreign key (parent_id) references 主表 (parent_id)
);
#
create table temp04 (
c_id int,
p_id int,
name char(20), age int,
foreign key (p_id) reference emp (id)
);
2.使用 alter table 添加外键
#fk_name:外键约束的名称,子表是包含外键的表,主表是包含外键引用的主键的表,外键字段是子表中的字段,引用主表中的主键字段。
alter table 子表名
add constraint 外键名称
foreign key(外键字段) references 主表名 (主键字段);
#
# 在 子表 中添加一个名为 外键名称 的外键约束,
# 确保 子表 中的每个 外键字段 值都必须在 主表 的 主键字段 中有对应的条目。
# 如果尝试插入一个在 主表 中不存在的 主/外键字段 到 子表 ,操作将会失败,因为违反了外键约束。
3.删除外键约束: 外键约束名:fk_name
alter table 子表名
drop foreign key 外键约束名;
注意事项:
- 外键列和引用的列必须具有相同的数据类型。
- 如果外键列允许NULL值,那么引用列也必须允许NULL值。
- 在InnoDB存储引擎中,外键约束可以正常工作。但如果你使用的是MyISAM或其他不支持外键的存储引擎,外键约束将不会被强制执行。
- 在添加外键之前,确保子表中没有违反外键约束的数据。
3.自增长约束 auto_increment
auto_increment自增:自动编号, 通常与主键一起使用,以保证每个新记录都有一个唯一的标识符,起始值为1,每次的增量为1。当插入记录时,如果为AUTO_INCREMENT数据列明确指定了一个数值,则会出现两种情况:
- 如果插入的值与已有的编号重复,则会出现出错信息,因为AUTO_INCREMENT数据列的值必须是唯一的;
- 如果插入的值大于已编号的值,则会把该插入到数据列中,并使在下一个编号将从这个新值开始递增。也就是说,可以跳过一些编号。如果自增序列的最大值被删除了,则在插入新记录时,该值被重用。
(每张表只能有一个字段为自曾) (成了key才可以自动增长)
1.创建表时使用:
create table test4 (
id int primary key auto_increment,
name varchar(30),
addr varchar(50)
);
insert into test4(name, addr) values('tom','北京'), ('jack', '上海');
2.修改现有表以使用:
alter table 表名 change 字段 字段 类型 auto_increment;
alter table 表名 modify 字段 类型 auto_increment;
#示例:
alter table test4 change id id int auto_increment;
alter table test4 modify id int auto_increment;
3.删除自增长:覆盖掉
alter table 表名 change 字段 字段 类型 not null;
alter table 表名 modify 字段 类型 not null;
#示例:
alter table test4 change id id int not null;
alter table test4 modify id int not null;
change和modify是 alter table 语句中的两个不同的子句,主要区别:
- 名称更改:change可以更改列的名称,而modify不能。
- 定义更改:两者都可以更改列的数据类型和属性,但modify只能用于不涉及名称更改的情况。
4.唯一约束 unique
- 一个表中可以有多个唯一约束。
- 唯一约束列可以包含NULL值,但只能有一个NULL值。
- 唯一约束不要求唯一标识记录,主要用于确保数据的唯一性。
1.创建表时添加约束:
create table 表名 (字段1 类型 unique, 字段2 类型,......);
#示例:
create table test (
id int,
name varchar(30) unique,
addr varchar(50)
);
2.修改现有表以添加unique约束:
alter table test add unique (id);
3.取消表的 unique 约束:
#在MySQL中,unique 约束通常与索引相关联。要删除unique约束,需要删除相应的索引。
### 1.确保在删除唯一约束之前,新的数据模型仍然符合你的业务逻辑和数据完整性要求。
### 2.删除唯一约束可能会允许数据中出现重复的值
### 3.如果在删除唯一约束时遇到问题,可能是因为有依赖于该约束的外键约束存在。在这种情况下,可能需要先删除或修改相关的外键约束。
#查看现有索引及其类型:
show index from 表名;
#取消字段索引
alter table 表名 drop index 字段;
5.是否为空 null
1. 是否允许为空,默认null,可设置not null,字段不允许为空,必须赋值;
2. 字段是否有默认值,缺省的默认值是null,如果插入记录时不给字段赋值,此字段使用默认值;
1.创建时:
create table 表名 (字段1 类型 not null, 字段2 类型,......);
#
create table test(id int, sex char(10) not null default "man", age int, addr char(20));
2.修改字段允许为空:
alter table test change sex sex char(10) null;
alter table test modify sex char(10) null;
6.字符集
修改字符集 :在创建表的最后面指定一下: default charset=utf8
create table test(id int, name char(10), age int) default charset=utf8;
#在配置文件中修改:
vim /etc/my.cnf
#在[mysqld]里面加入:
character_set_server = utf8
#重启服务
#注意:在修改配置文件之前的库,修改字符集后不会产生影响。