Linux_MySQL 表的约束(主键,唯一键,外键,主表,从表)

本文详细介绍了MySQL中的关键约束条件,包括空属性处理、默认值设定、列描述、自增长主键、唯一键和外键的使用。掌握这些规则有助于确保数据的准确性和一致性。


MySQL本质是一套存储数据的方案,除了解决基本的数据存储外,还需要一定的约束条件,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性,减少用户的误操作可能性。

约束是MySQL通过限制用户操作的方式,来达到维护数据本身的安全和完整的一套方案。

这里主要学习下面几种约束条件

null/not null,default, comment, zerofill,primary key, auto_increment,unique key

1.空属性 null/not null

数据库默认字段为空。这个默认值可以在建表的时候修改

eg:创建学生表

表的信息为学生姓名以及班级,这两个属性在插入的时候不能为空。

这里创建了两个表做对比。
在这里插入图片描述
在这里插入图片描述

不允许空值的插入如下图:
在这里插入图片描述
允许空值插入如下
在这里插入图片描述

2.设置默认值default

创建表时在对应的字段添加default默认值即可。

在这里插入图片描述

注意创建表时可以选择不允许默认值,但是修改默认值。在MySQL这个数据库此时not null这个设置选项无意义。尽量不要这样设置。

在这里插入图片描述

3.列描述符comment

在这里插入图片描述
列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存。类似于批注功能。告诉使用人这一列的特点。

4.格式化输出zerofill

如果宽度小于类型设定值会自动补充0
在这里插入图片描述

5.主键primary key

primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型。

eg:学生表
学生学号只能有一个,学号设置为主键,当学号重复时发生主键冲突。同时学号这一项不能为空
在这里插入图片描述
不推荐给主键设置默认值,语法是可以的。主键因为不能重复,默认值只能使用一次毫无意义

删除表的主键:
alter table table_name drop primary key;
在这里插入图片描述
在这里插入图片描述
向表中添加主键:
alter table table_name add primary key(添加主键的列名);
在这里插入图片描述
当将一个列添加为主键时,这一列自动变为不允许默认值。


复合主键

创建表时,可以选择使用多个列来构成一个主键,这种主键称为复合主键。

当构成在主键的所有列冲突时,此时才会发生主键冲突。

eg:选择学生的排名和学号作为复合主键
在这里插入图片描述

6.自增长 auto_increment

auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。只有主键才可以被设置成自增长,作为逻辑主键。

一般自增长类型为整形,且一个表只有一个自增长类型。

综上:

  • 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
  • 自增长字段必须是整数
  • 一张表最多只能有一个自增长
    在这里插入图片描述
    在这里插入图片描述

在设置主键的之后,一般是将与业务逻辑无关的列作为主键,比如自增长序列。

查询最后一次插入的id值函数:
select last_insert_id();
在这里插入图片描述

7.唯一键unique key

一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题。

注意:
唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。

主键和唯一键的区分:

  • 主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。

唯一键的本质目的是为了让数据更加安全,完整性更高。
在这里插入图片描述

8.外键foreign key

实际业务不可能只有一张表,外键存在的意义是建立表与表之间的关系的

外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。

当定义外键后,要求外键列数据必须在主表的主键列存在或为null。

注意:

  1. 主表是被关联的表,从表是关联其他表的表。

在这里插入图片描述

外键必须在从表上定义,且对应主表上必须是有主键约束或unique约束。

添加外键语法:
foreign key (字段名) references 主表(列)

eg:创建如上图所示的表结构。

首先创建主表 选课表:

在这里插入图片描述
其次创建从表 学生信息表:
在这里插入图片描述

这时语义上面已经存在了外键,但是数据库还无法检测。
eg:
如果此时向从表(学生信息表)中插入一个学生的信息,但这个学生信息的选课号不在选课表里面,从业务逻辑上讲,这次插入应该是失败的,但是因为我们还没有在从表上设置外键,所以在数据库语法上,这次插入会成功。

现在假设这个学校只有两节课,课程信息如下。
在这里插入图片描述
则插入选课号为600的学生应该不成功,因为学校没有编号为600这个课。但是此时插入会成功。
在这里插入图片描述
这时候就需要向从表添加外键约束,告诉MySQL这两张表存在约束。

在这里插入图片描述

<think>我们被要求查询MySQL信息。根据引用[4],我们可以使用以下SQL语句来查询特定信息: ```sql SELECT i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME FROM information_schema.TABLE_CONSTRAINTS i JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME WHERE i.TABLE_SCHEMA = 'your_database_name' AND i.TABLE_NAME = 'your_table_name' AND i.CONSTRAINT_TYPE = 'FOREIGN KEY'; ``` 但是,引用[4]提供的语句中,SELECT部分没有指定列别名,而且连接条件可能不够完整(通常还需要加上约束所在的数据库名和名匹配)。为了更准确,我们可以参考标准做法。 实际上,更完整的查询信息的语句如下(结合引用[3]和引用[4]): ```sql SELECT k.CONSTRAINT_NAME AS '约束名', k.COLUMN_NAME AS '列名', k.REFERENCED_TABLE_NAME AS '关联', k.REFERENCED_COLUMN_NAME AS '关联列' FROM information_schema.KEY_COLUMN_USAGE k WHERE k.TABLE_SCHEMA = 'your_database_name' AND k.TABLE_NAME = 'your_table_name' AND k.REFERENCED_COLUMN_NAME IS NOT NULL; ``` 或者,我们可以通过连接`TABLE_CONSTRAINTS`来确保只获取约束: ```sql SELECT tc.CONSTRAINT_NAME, kcu.COLUMN_NAME, tc.CONSTRAINT_TYPE, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME FROM information_schema.TABLE_CONSTRAINTS tc JOIN information_schema.KEY_COLUMN_USAGE kcu ON tc.CONSTRAINT_SCHEMA = kcu.CONSTRAINT_SCHEMA AND tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME WHERE tc.TABLE_SCHEMA = 'your_database_name' AND tc.TABLE_NAME = 'your_table_name' AND tc.CONSTRAINT_TYPE = 'FOREIGN KEY'; ``` 注意:将`your_database_name`和`your_table_name`替换为实际的数据库名和名。 ### 步骤说明: 1. 使用`information_schema.TABLE_CONSTRAINTS`获取指定上的所有约束(包括主键唯一键等)。 2. 通过`CONSTRAINT_TYPE = 'FOREIGN KEY'`过滤出约束。 3. 连接`information_schema.KEY_COLUMN_USAGE`,获取约束的详细信息,包括列、关联的和列。 ### 示例: 假设我们要查询数据库`mydb`中`orders`的信息: ```sql SELECT tc.CONSTRAINT_NAME AS '约束名称', kcu.COLUMN_NAME AS '列', kcu.REFERENCED_TABLE_NAME AS '关联', kcu.REFERENCED_COLUMN_NAME AS '关联列' FROM information_schema.TABLE_CONSTRAINTS tc JOIN information_schema.KEY_COLUMN_USAGE kcu ON tc.CONSTRAINT_SCHEMA = kcu.CONSTRAINT_SCHEMA AND tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME WHERE tc.TABLE_SCHEMA = 'mydb' AND tc.TABLE_NAME = 'orders' AND tc.CONSTRAINT_TYPE = 'FOREIGN KEY'; ``` ### 注意事项: - 如果在多个数据库中,确保`TABLE_SCHEMA`条件指定正确的数据库名。 - 该查询会返回所有约束,每个约束可能有多列(复合),此时会返回多行,每行对应一列。 ### 其他方法: 在MySQL中,还可以使用`SHOW CREATE TABLE`语句来查看结构,其中包含信息: ```sql SHOW CREATE TABLE your_table_name; ``` 这种方法会返回一个包含完整建语句的结果集,其中约束以`CONSTRAINT ... FOREIGN KEY ... REFERENCES ...`的形式显示。 ### 总结: 查询MySQL信息,推荐使用`information_schema`数据库中的进行查询,这样可以灵活获取所需字段。如果只是快速查看,使用`SHOW CREATE TABLE`命令更直观。 §§相关问题§§ 1. 如何查询MySQL中引用某个的所有关系? 2. 如何禁用和启用MySQL检查? 3. 在MySQL中如何删除约束?</think>### MySQL 查询信息的完整指南 #### 方法1:使用 `information_schema` 系统(推荐) ```sql SELECT CONSTRAINT_NAME AS '约束名', COLUMN_NAME AS '列', REFERENCED_TABLE_NAME AS '关联', REFERENCED_COLUMN_NAME AS '关联列' FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = 'your_database' AND TABLE_NAME = 'your_table' AND REFERENCED_TABLE_NAME IS NOT NULL; ``` **参数说明**: - `your_database`:数据库名称 - `your_table`:要查询的名 - `REFERENCED_TABLE_NAME IS NOT NULL`:确保只筛选约束 **输出示例**: | 约束名 | 列 | 关联 | 关联列 | |---------------------------|---------|----------|--------| | fk_order_customer | cust_id | customer | id | | fk_order_product | prod_id | product | sku | #### 方法2:使用 `SHOW CREATE TABLE` 命令 ```sql SHOW CREATE TABLE your_table; ``` 输出结果中的 `CONSTRAINT` 部分会显示完整的定义: ```sql CONSTRAINT `fk_order_customer` FOREIGN KEY (`cust_id`) REFERENCES `customer` (`id`) ON DELETE CASCADE ``` #### 方法3:查询所有依赖关系(引用当前) ```sql SELECT TABLE_NAME AS '依赖', COLUMN_NAME AS '依赖列', CONSTRAINT_NAME AS '约束名' FROM information_schema.KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_SCHEMA = 'your_database' AND REFERENCED_TABLE_NAME = 'your_table'; ``` #### 方法4:获取的详细配置(删除/更新规则) ```sql SELECT CONSTRAINT_NAME, DELETE_RULE, UPDATE_RULE FROM information_schema.REFERENTIAL_CONSTRAINTS WHERE CONSTRAINT_SCHEMA = 'your_database' AND TABLE_NAME = 'your_table'; ``` **删除/更新规则说明**: - `CASCADE`:级联删除/更新 - `RESTRICT`:禁止操作(默认) - `SET NULL`:设为NULL - `NO ACTION`:无操作(同RESTRICT) ### 操作示例 假设需要查询数据库`sales_db`中`orders`: ```sql -- 查询orders SELECT CONSTRAINT_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = 'sales_db' AND TABLE_NAME = 'orders' AND REFERENCED_TABLE_NAME IS NOT NULL; -- 查询哪些引用了products SELECT TABLE_NAME, COLUMN_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_SCHEMA = 'sales_db' AND REFERENCED_TABLE_NAME = 'products'; ``` ### 注意事项 1. **权限要求**:需要访问`information_schema`的权限 2. **大小写敏感**:Linux系统下数据库/名区分大小写 3. **状态检查**:使用`SELECT @@FOREIGN_KEY_CHECKS`查看约束是否启用 4. **批量处理**:当需要修改时,先禁用检查可提高效率: ```sql SET FOREIGN_KEY_CHECKS = 0; -- 执行DDL操作 SET FOREIGN_KEY_CHECKS = 1; ``` ### 可视化工具替代方案 对于复杂的关系,推荐使用: 1. MySQL Workbench:右 → "Table Inspector" → "Foreign Keys" 2. phpMyAdmin:进入结构 → "关系视图" 3. Navicat:设计 → ""标签页 > 通过这些方法,您可以全面掌握MySQL关系,为数据库维护和优化提供关信息[^1][^2][^3][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BaiRong-NUC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值