admin 发表于 2026-2-26 14:16:31

名词解释 primary key 的例子_什么是主键约束在MySQL中如何定义?_为什么复合主键在订

<h2>你有没有遇到过:删不掉重复数据,或者一加新记录就报“Duplicate entry”错误?</h2>

<p>这十有八九,是<strong>主键(primary key)没设对</strong>。别慌——它真没听起来那么吓人。今天咱们就用大白话,把“primary key”从概念到例子,掰开揉碎讲清楚。</p>

<h2>什么是 primary key?先说人话版定义</h2>

<ul><li>*主键,就是一张表里唯一能“指名道姓”认出某一行的字段(或字段组合)**。</li></ul>
<p>它像身份证号之于人:不能空、不能重复、全表唯一。</p>

<p>举个最直白的例子??</p>
<p>```sql</p>
<p>CREATE TABLE users (</p>
<p>id INT PRIMARY KEY,</p>
<p>name VARCHAR(50)</p>
<p>);</p>
<p>```</p>
<p>这里 `id` 就是主键——以后每新增一条用户,系统会强制检查:这个 `id` 之前有没有用过?是不是 NULL?没通过?直接拦住,不让你插进去。</p>

<p>> ?? 我自己的体会:刚学时总以为“主键=自动编号”,其实不是。它可以是手机号(如果业务保证不重复)、订单号(如“ORD20240521001”),甚至邮箱——只要满足“非空+<p>唯一”就行。</p>

<h2># 主键的三个铁律,记牢就少踩80%的坑</h2>

<ul><li><strong>非空性</strong>:主键字段值绝不允许是 NULL(数据库直接拒绝插入)</li><li><strong>唯一性</strong>:整张表里,这个值只能出现一次,多一次都不行</li><li><strong>不可更改性(建议)</strong>:虽然技术上可以 UPDATE 主键,但极不推荐——外键关联、日志追踪、缓存逻辑全会乱套</li></ul>
<p>? 正确做法:用自增 ID 或 UUID 做主键,安心省心。</p>
<p>? 反面案例:用“姓名”当主键?重名怎么办?用“城市名”?全国几十个北京镇……立马崩。</p>

<h2>复合主键:两个字段一起当“身份证”,什么场景非用不可?</h2>

<p>有时候,单个字段压根没法唯一标识一行。比如这张订单明细表:</p>

<p>| order_id | product_id | quantity |</p>
<p>|----------|------------|----------|</p>
<p>| 1001   | P005       | 2      |</p>
<p>| 1001   | P007       | 1      |</p>
<p>| 1002   | P005       | 3      |</p>

<p>你看:`order_id` 单独不唯一(一个订单买多个商品),`product_id` 单独也不唯一(同一商品被不同订单买)。但 <strong>`order_id + product_id` 组合起来,就天然唯一了</strong>——同一个订单里,不可能重复添加同一款商品两次。</p>

<p>所以建表时这样写:</p>
<p>```sql</p>
<p>CREATE TABLE order_items (</p>
<p>order_id INT,</p>
<p>product_id INT,</p>
<p>quantity INT,</p>
<p>PRIMARY KEY (order_id, product_id)</p>
<p>);</p>
<p>```</p>

<p>> ?? 我的看法:复合主键不是炫技,而是<strong>对业务逻辑的诚实表达</strong>。强行塞个无意义自增ID,反而让表结构“失真”。但前提是:这两个字段真的稳定、可预测、不常变。</p>

<h2>初学者最容易卡壳的3个问题(自问自答)</h2>

<ul><li>*Q:主键和索引是什么关系?**</li></ul>
<p>A:主键<strong>自动创建唯一索引</strong>,所以查询快——但这不是它的主要目的。它的核心使命是<strong>保证数据完整性</strong>,索引只是顺带福利。</p>

<ul><li>*Q:一张表能有几个主键?**</li></ul>
<p>A:<strong>只能有一个</strong>。但这个主键可以由1个字段构成(单列主键),也可以由2个及以上字段构成(复合主键)。</p>

<ul><li>*Q:主键一定要自增吗?**</li></ul>
<p>A:完全不用。MySQL 默认支持自增,但 PostgreSQL 常用 UUID,MongoDB 根本没有传统主键概念……关键是看你的业务要不要分布式、要不要隐藏增长规律。</p>

<p>最后聊句实在的:学主键,别死背定义。打开你的数据库工具,建两张表——一张用 `id INT PRIMARY KEY AUTO_INCREMENT`,另一张用 `(user_id, created_at)` 当复合主键,手动 INSERT 几条试试。报错几次,比看十篇教程都管用。</p>

<p>真实世界里,<strong>好设计往往藏在“不让错发生”的细节里</strong>。主键,就是第一道门禁。</p>
页: [1]
查看完整版本: 名词解释 primary key 的例子_什么是主键约束在MySQL中如何定义?_为什么复合主键在订