大家好,我是小米,今年31岁,一个依旧在技术圈里折腾、爱分享的大哥哥。今天要跟大家聊一个很多人都在面试中遇到的经典问题:
“SQL 约束有哪几种?”
别看问题短,里面的门道可不少。尤其是社招面试官,问这个问题的时候,往往不仅仅想听到你背八股文式的答案,还想听你结合实际场景,说出你对数据库设计的理解。
为了让这个问题更有意思,我给大家讲一个我前阵子面试的真实小故事。
面试现场:约束的灵魂拷问
那天我去面试一家互联网公司,面试官是个看起来很有经验的大哥,聊了几句以后,突然抛出一句:
“小米,你能说说 SQL 里有哪些约束吗?我们在实际项目里是怎么用的呢?”
我当时心里一紧。这个问题看似简单,其实就是一个“送命题”——要么你只背几个关键词,被打入“只会死记硬背”的分类;要么你能说清楚背后的设计哲学,面试官立马会觉得你是个能解决实际问题的人。
于是,我深吸一口气,开始从“约束”的本质聊起。
什么是约束?——给数据上保险
我对面试官说:
“约束,其实就是数据库帮我们加的保险。它规定了表里的数据必须满足某些规则,否则就不允许存进去。目的只有一个:保证数据的正确性和一致性。”
面试官点点头,我接着举了个例子:
想象一下,你在做一个电商系统,如果没有约束:
- 用户可以注册一个没有手机号的账号;
- 商品库存可以是负数;
- 订单可以没有关联的用户;
- 同一个邮箱可以注册 100 个账号。
是不是一想就很可怕?
而约束,就是用来防止这些“数据灾难”的。
SQL 约束的六大门派
说到具体的约束,其实 SQL 里有六大“门派”。我用江湖的方式给大家捋一遍:
1. NOT NULL(非空约束)——“最基本的规矩”
这个约束就像家规里的第一条:不能缺胳膊少腿。
比如,用户表里的 username,你不可能让它为空吧?否则系统里就会出现一堆匿名用户,管理起来乱七八糟。

一旦设置了 NOT NULL,你插入数据时必须提供值,否则报错。
2. UNIQUE(唯一约束)——“一号身份牌”
这个就像身份证,一个人只能有一个号码。
比如用户的邮箱,必须唯一。如果允许重复,那 A 用户和 B 用户都用同一个邮箱,你还能分得清谁是谁吗?

有意思的是,UNIQUE 可以跟 NULL 搭配。一个字段如果是 UNIQUE 但允许 NULL,那可以插入多条 NULL(因为数据库认为 NULL ≠ NULL)。这个小坑面试官常常会考。
3. PRIMARY KEY(主键约束)——“江湖的掌门”
主键约束就更霸气了,它既不能为 NULL,也必须唯一。
每张表都应该有一个主键,它就是这张表的“身份证号码”。
比如用户表里的 id:

有了主键,数据库就能快速定位到一条唯一的数据记录。
4. FOREIGN KEY(外键约束)——“江湖的盟约”
外键约束是最能体现“江湖规则”的。它规定了一种表与表之间的关系。
比如,订单表里的 user_id,就应该是用户表 id 的外键。这样才能保证:
- 插入订单时,必须有对应的用户存在;
- 删除用户时,得先考虑如何处理他的订单。

当然,在大规模高并发系统里,很多公司会减少外键的使用,用应用层逻辑来维护关联,因为外键对性能和扩展性会有影响。这点如果在面试时顺便提一下,面试官往往会心一笑。
5. CHECK(检查约束)——“规矩的底线”
CHECK 就像家里的规矩里加的一句“只许正能量,不许胡闹”。
比如,用户的年龄必须大于 0:

不过要注意的是,MySQL 在 8.0 之前几乎不真正执行 CHECK,只是语法上允许。面试的时候提到这个小细节,会让你显得很“有经验”。
6. DEFAULT(默认值约束)——“贴心的小助手”
DEFAULT 就像系统帮你准备的默认设置。
比如用户注册时没有填头像,就给他一个默认头像;注册时间没传,就用当前时间。

这样能减少很多麻烦,还能保证数据完整性。
约束的组合拳:江湖高手的修炼方式
说到这里,我没有停,而是补充了一点实战经验:
很多时候,单独用一个约束不够,真正的高手是会“组合拳”的。比如:
- 用户表的 id:PRIMARY KEY + AUTO_INCREMENT
- 商品表的 sku:NOT NULL + UNIQUE
- 订单表的 user_id:NOT NULL + FOREIGN KEY
这样设计下来,不仅能保证数据的严谨性,还能让逻辑关系更清晰。
约束之外:工程实践中的取舍
面试官听到这时,突然问了一句:
“那你觉得在真实的项目里,我们要不要都用上这些约束?”
这个问题,其实是考察你有没有实战经验。
我回答说:
在小型系统里,完全可以依赖数据库约束来保证数据的正确性。
但在大型分布式系统里,有时候会适度放弃外键、CHECK 这种约束,而改由应用层来控制。原因主要有三点:
- 性能:外键、CHECK 会增加数据库负担;
- 灵活性:微服务化后,表的依赖关系可能会拖慢开发;
- 可维护性:应用层代码更容易做复杂逻辑,比如跨表的校验。
不过,像 NOT NULL、PRIMARY KEY、DEFAULT 这种轻量级约束,还是必须保留的,它们几乎不会带来额外负担。
复盘:如何回答面试官
我总结了一下这个问题的答题思路,分享给大家:
- 先总述:约束是保证数据正确性和一致性的规则。
- 再分类:NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY、CHECK、DEFAULT 六种。
- 加例子:结合用户、订单、电商场景,解释每种约束。
- 谈实践:说明约束在大规模项目里的取舍和注意点。
- 补细节:比如 UNIQUE + NULL 的坑、MySQL 8.0 之前 CHECK 的限制。
这样一套流程走下来,不仅展示了知识点,还体现了思考和经验,面试官基本就能被你“拿下”。
写在最后
回到面试那天,面试官听完我的回答,笑着说:“小米,你这个思路很全面,看来平时是真做过项目的。”
虽然那次面试我最终没去那家公司,但我觉得这道题真的很经典。它表面是一个知识点,背后考察的却是你对数据库设计哲学的理解。
如果你下次面试再遇到这个问题,不妨按照我分享的这个思路去回答。记住:别死记硬背,把知识讲成故事,把经验讲成思路,面试官才会真正认可你。
END
好了,今天的分享就到这。
我是小米,一个喜欢分享技术的31岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!
1046

被折叠的 条评论
为什么被折叠?



