MySQL中表的约束

1,概念

表中一定要有各种约束,通过约束,让我们来插入数据库中的数据是符合预期的。

约束本质是通过技术手段,倒逼程序员插入正确的数据;反过来,站在MySQL的角度来单,内部已经插进来的数据,都i是符合数据约束的数据。

约束的最终目标:保证数据完整性和可预期性

为了完成以上的所有目标,就需要除了数据类型自带的范围约束以外的更多约束。

2,空属性

在MySQL里,null表示没有而不是0,' '代表空串。

两个值:null(默认的)和not null(不为空)

数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办 法参与运算。

操作:在创建表后面加上not null;

 可以看到,在创建元素的时候加了 not null,在查看表的时候Null列里就会显示NO。

那么插入操作:

                   

可以看到,insert里不对加了空约束的值插入数据时系统会报错,当然可以插入空串;还有一个操作也无法插入数据:

3,默认值

默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候, 用户可以选择性的使用默认值。

例子:

可以看到,表中default这一列出现了值,接下来我们插入几个值测试一下:

可以看到,在我们不输入值的时候就会默认给我们输入缺省,在用户输入元素的时候,就会选择用户输入的元素插入。

可以看到,我给age设置了not null 和 default:

可以看到,就算加了not null 没对age指定插入时不会报错,且使用的时缺省值,但是指定对age插入空的话就会报错。

在我们日常使用中,not null和default是互相补充的。

not null 和 default 一般不需要同时出现,以为default本身默认值不会为空。

4,列描述

操作:comment + 内容

没有实际含义,更类似于我们平时写代码的注释:

5,zerofill

刚开始学习数据库时,很多人对数字类型后面的长度很迷茫。通过show看看text14表的建表语句:

可以看到int(11),这个代表什么意思呢?整型不是4字节码?这个11又代表什么呢?其实没有zerofill这个 属性,括号内的数字是毫无意义的。age和id列就是前面插入的数据,如下:

那么我们稍微改一下id的属性,在后面加上zerofill:

可以看到,在id加了zerofill的约束之后,在100前面会补零,其总位数就是11位,正好对上

int(11)的括号里的值,那么改完属性之后里面的100的值会不会发生改变?

可以用where查到,值是不会发生改变的。

那么zerofill的作用在哪里?

可以在固定的长度中让表的宽度保持一直以维持美观,当然如果插入的位数大于zerofill定义的位数,也可以成功插入,但是超过的位数会有图出:

6,主键

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

那么我们来插入数据测试一下:

可以看到,当我们插入重复的数据的时候,系统会拦截不给我们插入:

可以看到,也不能往里面插入空值.

那么如何去掉主键?

以为整个表里就一个主键,所以直接指明要删主键系统自动就会帮我们删除。

在删除了主键之后,我们就可对其进行插入重复值的操作:

那么如何插入主键?

可以看到,我们要把表内重复的数据和null清理了才可以插入主键。

7,复合主键

我们知道,一个表中主键只有一个,但是不意味着一个表的主键只能添加一列,这种多列主键的操作叫做复合主键。

操作:

可以看到key位置的id和course位置都有pri,现在我们对他插入测试:

这就是复合主键的使用方法。

8,主键子问题:自增长

auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值 +1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。

可以看到,id在我们不插入值时他会固定增长,要是插入的值和表中id相同则会报错。

我们可以指定某个数字开始加一:

也可以在创建表时,在表的结尾写:auto_increment = 500来改想要的id起始值:

9,唯一键(可以为空)

一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以 解决表中有多个字段需要唯一性约束的问题,除了可以为空,其他操作和主键相同,如果想让值不为空,可以加not null。

关键字:unique

那么我们来插入一下数值看看:

可以看到,插入的id不能重复,但是可以为空。

主键选择了某个元素为主键,这时如果其他值也有唯一性的时候,可以用唯一键来补充,唯一键与主键并不冲突,他们是相互补充的。

例如个人id和telphone(电话),都是唯一的。

10,外键

外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique 约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。

语法:foreign key (字段名) references 主表(列)

我们在进行复杂的表管理时,难免不了经常有表与表之间有精密的联系,这个时候我们可以用外键来相互对两张表进行相互约束:

接下来看案例:

我们可以看到,表与表之间存在某种关联,主表是calss,从表是student,这时我们可以使用外键命令来约束,一般外键写在从表:

那么我们来插入数据测试一下:

可以看到,在符合主表的条件下可以插入,但是不符合主表约束条件的不给插入

如果从表有数据,那么主表的相关的数据不能被删掉:

希望对你们有帮助。

MySQL 中,删除表的约束(如主键、外键、唯一约束、检查约束等)需要根据约束类型使用不同的语法。由于 MySQL 不支持直接通过 `DROP CONSTRAINT` 这种通用语法(像 Oracle 那样),必须明确知道约束的名称或结构。 以下是 **详细的操作方法和代码示例**: --- ### ✅ 1. 删除主键约束(PRIMARY KEY) ```sql ALTER TABLE 表名 DROP PRIMARY KEY; ``` #### 示例: ```sql ALTER TABLE user DROP PRIMARY KEY; ``` > ⚠️ 注意:如果主键被用作自增(AUTO_INCREMENT),不能直接删除,需先移除 `AUTO_INCREMENT` 属性(但通常不需要单独移除,MySQL 会自动处理)。 --- ### ✅ 2. 删除外键约束(FOREIGN KEY) 你需要知道外键的名称,或者先查询出来。 #### 查询外键名称: ```sql SELECT CONSTRAINT_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = '你的数据库名' AND TABLE_NAME = '你的表名' AND REFERENCED_TABLE_NAME IS NOT NULL; ``` #### 删除外键: ```sql ALTER TABLE 表名 DROP FOREIGN KEY 外键约束名; ``` #### 示例: ```sql ALTER TABLE order_info DROP FOREIGN KEY fk_order_user; ``` > 🔁 删除外键后,你还可能想删除对应的普通索引(因为外键会自动创建索引): > > ```sql > ALTER TABLE order_info DROP INDEX idx_user_id; -- 索引名需自行确认 > ``` --- ### ✅ 3. 删除唯一约束(UNIQUE KEY) 唯一约束本质上是一个唯一索引,所以要通过删除索引来实现。 #### 查询唯一约束名: ```sql SHOW INDEX FROM 表名 WHERE Non_unique = 0; ``` #### 删除唯一索引: ```sql ALTER TABLE 表名 DROP INDEX 唯一约束名; ``` #### 示例: ```sql ALTER TABLE user DROP INDEX uk_email; -- uk_email 是唯一约束名 ``` > 💡 如果你没有给唯一约束命名,MySQL 会默认使用字段名作为索引名,例如 `email`。 --- ### ✅ 4. 删除检查约束(CHECK CONSTRAINT) MySQL 8.0+ 支持 `CHECK` 约束,删除方式如下: ```sql ALTER TABLE 表名 DROP CONSTRAINT 检查约束名; ``` #### 示例: ```sql ALTER TABLE user DROP CONSTRAINT chk_age_range; ``` > ❗ 注意:MySQL 5.7 及以下版本虽然允许写 `CHECK` 语法,但**不实际生效也不存储**,因此无需删除。 --- ### ✅ 5. 删除默认值约束? 严格来说,MySQL 没有“默认值约束”这个独立对象。你可以通过修改字段来清除默认值: ```sql ALTER TABLE 表名 ALTER COLUMN 字段名 DROP DEFAULT; ``` #### 示例: ```sql ALTER TABLE user ALTER COLUMN age DROP DEFAULT; ``` > 或者重新设置为其他默认值: > ```sql > ALTER TABLE user ALTER COLUMN age SET DEFAULT 18; > ``` --- ### 🧪 实际操作流程建议 #### 步骤 1:查看表的所有约束信息 ```sql -- 查看建表语句(包含所有约束) SHOW CREATE TABLE user; -- 或查询 information_schema 中的约束 SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA = 'your_db_name' AND TABLE_NAME = 'user'; ``` #### 步骤 2:根据类型执行删除命令 --- ### ⚠️ 注意事项 | 问题 | 说明 | |------|------| | **必须知道约束名** | 特别是外键和唯一键,否则无法删除 | | **外键依赖索引** | 删除外键不会自动删除对应索引,需手动清理 | | **主键只能有一个** | 所以 `DROP PRIMARY KEY` 不需要名字 | | **Online DDL** | 大多数 `DROP` 操作支持在线执行,但仍建议低峰期操作大表 | ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值