首页 > 数据库 >MySQL【表完整性约束】

MySQL【表完整性约束】

时间:2024-07-16 21:00:29浏览次数:23  
标签:int alter 外键 约束 完整性 MySQL table 主键 id

约束条件 说明

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
#重启服务
#注意:在修改配置文件之前的库,修改字符集后不会产生影响。

标签:int,alter,外键,约束,完整性,MySQL,table,主键,id
From: https://blog.csdn.net/qq_43606536/article/details/140476483

相关文章

  • MySQL【源码安装安装 mysql】
    1.当前目录:修改属主属组cd/usr/local/mysqlchown-Rmysql.mysql.2.初始化数据库:mysql/bin/mysqld./bin/mysqld--initialize--user=mysql--basedir=/usr/local/mysql--datadir=/usr/local/mysql/data/#拿到随机密码:#[Note]Atemporarypasswordisgeneratedf......
  • WPF read data from mysql and display via ADO.NET
    //xaml<Windowx:Class="WpfApp216.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mi......
  • MySQL主从复制过程
    1、主库操作:修改数据库配置文件liunx的my.cnf文件;windows系统的my.ini文件[mysqld]#最大链接数max_connections=1000#主库----start---同一局域网内注意要唯一server-id=100#开启二进制日志功能,可以随便取(关键)log-bin=mysql-bin#记录的数据库(多数据库用逗号......
  • MySQL 索引
    MySQL索引一、介绍二、索引的分类三、单列索引、组合索引四、全文索引五、空间索引六、索引的原理、优缺点、创建原则一、介绍索引是通过某种算法,构建出一个数据模型,用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的......
  • MySQL数据库一主一从集群配置
    环境环境三部曲1.全新服务器-互相通信2.全新安装mysql8.0-分别安装3.配置域名解析这里来讲一主一从的第二种连接方式,第一种的话可以参考下面连接:第一种方式一主一从(M-S)(2)需求实验2与上一个实验需求基本相同。master1作为主mysqlmaster2作为从mysql。不同之......
  • MySQL 数据库 day 7.16
        ok了家人们今天继续记录一下数据库,看看今天学了什么。一.事物概述1.1环境准备--账户表createtableaccount(idintprimarykeyauto_increment,namevarchar(20),moneydouble);insertintoaccountvalues(null,'张三',1000......
  • MySQL基础(必会)
    目录MySQL基础数据类型:事务事务操作事务的四大特性,ACID并发事务问题事务隔离级别MySQL基础数据类型:数值类型:字符类型:(!!!!char和varchar的区别一定要记住,博主第一次面试就被问到了)日期时间类型:事务事务是一系列操作的集合,他是不可分割的工作单位,事务会把所有的操作......
  • MySQL版本的相关问题:com.mysql.cj.jdbc.Driver和com.mysql.jdbc.Driver
    原文链接:https://www.cnblogs.com/daemonFlY/p/9820541.html1.在使用mysql时,控制台日志报错如下:Loadingclass`com.mysql.jdbc.Driver'.Thisisdeprecated.Thenewdriverclassis`com.mysql.cj.jdbc.Driver'.ThedriverisautomaticallyregisteredviatheSPIand......
  • 如何将Navicat MySQL 数据库表分组复用或分享给其他人?
    一般大家做软件项目中,数据库的表是非常多的!几百张表一眼望去密密麻麻!一点看的欲望都没有了!于是乎,NavicatMySQL新增了一项功能:表分组,这样我们只需要将每个业务模块的表放到一个分组中!如图是不是就非常清晰了!应该有不少童鞋都已经这样使用了! 于是乎,新的烦恼来了,这个分组只......
  • MySQL的学习
    关于数据库(DB)数据库是按照数据结构来组织、存储和管理数据的仓库。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。有什么类型关系型数据库所谓关系模型就是“一对一、一对多、多对多”等关系模型,非关系型数据库它们不保证关系数据的A......