MySQL六种约束的示例详解

作者:绿仔牛奶_ 时间:2024-01-16 19:15:38 

什么是约束

作用于表上的规则,限制存储在表中的数据

约束分类:

约束描述关键字
非空约束该字段数据不能为nullNOT NULL
唯一约束该字段数据唯一不重复UNIQUE
主键约束一行数据的唯一标识(非空且唯一)PRIMARY KEY
默认约束未指定该字段值则使用默认值DEFAULT
检查约束(8.0.16以后)该字段值满足某一条件CHECK
外键约束为两张表建立连接(数据一致、完整)FOREIGN KEY

创建表示例:

CREATE TABLE info(
`id` INT UNIQUE auto_increment PRIMARY KEY COMMENT'ID唯一标识',
`name` VARCHAR(10) NOT NULL UNIQUE COMMENT'姓名',
`age` INT CHECK(age > 0 && age < 120) COMMENT '年龄',
`status` CHAR(1) DEFAULT'1' COMMENT'状态',
`gender` CHAR(1) COMMENT'性别'
)COMMENT '用户信息表';

外键约束

外键通常用来为两张表建立连接,两张利用外键连接的表被称为父子表。

子表当中会设定一个外键字段用于关联父表的主键字段

即拥有外键的表是子表(从表),该外键对应另一个表的主键这个表称之为父表

如果没有设置外键,仅仅是将子表开了一个字段对应上了父表的主键字段在mysql层面是依旧没有任何关系的。此时两个表仅存在逻辑关系,无法保证数据的完整性和一致性

创建外键语法:

-- 在创建表时创建
CREATE TABLE son(
...
CONSTRAINT [外键名称] FOREIGN KEY(外键字段名) REFERENCES 主表名(主表主键字段名)
);
-- 创建表后为表添加主键
ALTER TABLE 表名ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段名) REFERENCES 主表(主表主键字段名)
-- 删除外键
alter table 表名 drop foreign key 外键名称;

创建示例:

# 父表
CREATE TABLE father(
`id` INT auto_increment PRIMARY KEY COMMENT'父表ID',
`name` VARCHAR(20) NOT NULL COMMENT'姓名',
`password` VARCHAR(20) DEFAULT(0000)
);
INSERT INTO father VALUES(null,'小三','1234'),(null,'小四','1234'),(null,'小五','1234'),(null,'小六','1234');
# 子表
CREATE TABLE son(
`id` INT auto_increment PRIMARY KEY COMMENT'子表ID',
`status` varchar(10) COMMENT '状态',
`fa_id` INT COMMENT'外键',
CONSTRAINT fk_father_son FOREIGN KEY(fa_id) REFERENCES father(id)
);
INSERT INTO son VALUES(null,'活',2),(null,'活',3),(null,'死',3),(null,'活',2);

上述示例 子表设置了外键,字段名为fa_id并关联到了父表主键id,外键名称为fk_father_son

创建完成后,我们添加几组数据。将几个son添加到表中,并设置外键字段属性为某个father。比如(null,&lsquo;活&rsquo;,3),那么此时如果我们尝试去删除父表id=3的这一行数据,就会提示错误。因为两个表已经在mysql层面上进行了关联

总结:

  • 从表的外键通常是主表的主键

  • 从表中外键的类型必须与主表中的主键类型一致

  • 主表数据发生变化时应注意从表数据的一致性问题

来源:https://blog.csdn.net/yuqu1028/article/details/128875020

标签:MySQL,约束
0
投稿

猜你喜欢

  • PHP 中关于ord($str)&gt;0x80的详细说明

    2024-05-13 09:24:13
  • PHP 动态生成静态HTML页面示例代码

    2024-05-02 17:18:13
  • Ajax+PHP边学边练 之五 图片处理

    2023-11-18 07:21:29
  • Javascript简写条件语句(推荐)

    2023-09-01 04:10:25
  • Vue中的字符串模板的使用

    2024-05-09 10:42:52
  • Python正则表达re模块之findall()函数详解

    2021-04-20 05:00:16
  • php获取域名的google收录示例

    2022-08-22 07:26:48
  • Python线性网络实现分类糖尿病病例

    2022-03-13 11:23:25
  • Python操作mysql数据库实现增删查改功能的方法

    2024-01-19 13:02:18
  • 利用Python实现Picgo图床工具

    2023-10-09 16:10:45
  • javascript实现tabs选项卡切换效果(自写原生js)

    2024-04-22 22:23:43
  • Python selenium根据class定位页面元素的方法

    2021-04-03 08:17:39
  • js实现树形数据转成扁平数据的方法示例

    2024-03-28 13:52:29
  • Python中的Nonetype类型怎么判断

    2021-06-19 17:33:13
  • TMDPHP 模板引擎使用教程

    2023-11-15 03:21:56
  • 剑走偏锋:体验ebay的AIR

    2008-11-13 11:51:00
  • PyQt4实现下拉菜单可供选择并打印出来

    2023-08-19 01:10:35
  • Vue常用指令v-if与v-show的区别浅析

    2024-05-28 15:46:57
  • vscode调试django项目的方法

    2022-03-07 01:02:51
  • SQL2005Express中导入ACCESS数据库的两种方法

    2024-01-24 04:05:30
  • asp之家 网络编程 m.aspxhome.com