MySQL【表完整性约束】

约束条件 说明

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数据列明确指定了一个数值,则会出现两种情况:

  1. 如果插入的值与已有的编号重复,则会出现出错信息,因为AUTO_INCREMENT数据列的值必须是唯一的;
  2. 如果插入的值大于已编号的值,则会把该插入到数据列中,并使在下一个编号将从这个新值开始递增。也就是说,可以跳过一些编号。如果自增序列的最大值被删除了,则在插入新记录时,该值被重用。

(每张表只能有一个字段为自曾) (成了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

  1. 一个表中可以有多个唯一约束。
  2. 唯一约束列可以包含NULL值,但只能有一个NULL值。
  3. 唯一约束不要求唯一标识记录,主要用于确保数据的唯一性。
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
#重启服务
#注意:在修改配置文件之前的库,修改字符集后不会产生影响。

  • 19
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值