主键约束是数据库设计中最重要的约束之一,您已经提供了非常全面的介绍。下面我将对主键约束进行系统性的总结和补充,并优化内容结构:

 

主键约束核心特性

1. 唯一标识:主键值必须唯一标识表中的每一行记录

2. 非空性:主键列不允许为NULL值

3. 单一性:每个表只能有一个主键约束

4. 索引自动创建:主键会自动创建聚集索引(在InnoDB中)

 

主键类型详解

单字段主键

定义方式一:在列定义时直接指定

CREATE TABLE users (
    user_id INT PRIMARY KEY,
    username VARCHAR(50)
);

 

定义方式二:在所有列定义后指定

CREATE TABLE products (
    product_id INT,
    product_name VARCHAR(100),
    PRIMARY KEY (product_id)
);

 

多字段联合主键

当单个字段无法唯一标识记录时使用:

CREATE TABLE student_courses (
    student_id INT,
    course_id INT,
    enrollment_date DATE,
    PRIMARY KEY (student_id, course_id)
);

 

联合主键设计原则:

1. 最小化原则:使用最少的必要字段组成主键

2. 稳定性原则:优先选择不常变化的字段

3. 简单性原则:尽量使用简单数据类型

 

主键管理操作

添加主键

添加单字段主键

ALTER TABLE employees ADD PRIMARY KEY (emp_id);

添加联合主键

ALTER TABLE order_items ADD PRIMARY KEY (order_id, product_id);

删除主键

ALTER TABLE table_name DROP PRIMARY KEY;

修改主键

MySQL不直接支持修改主键,需要先删除再添加:

 先删除原有主键

ALTER TABLE departments DROP PRIMARY KEY;

添加新的主键

ALTER TABLE departments ADD PRIMARY KEY (dept_code);

 

主键设计最佳实践

 

1. 选择合适的主键类型:

    自增整数(简单高效)

    UUID(分布式系统)

    自然键(当有明确的业务标识时)

 

2. 避免使用可变字段:如VARCHAR类型的主键会影响性能

 

3. 考虑使用代理键:当自然键过于复杂时

 

4. InnoDB表的注意事项:

    主键会作为聚簇索引

    没有显式主键时会自动生成隐藏主键

 

主键与索引的关系

 

 主键自动创建唯一索引

 主键索引是聚簇索引(InnoDB)

 主键查询效率最高

 

实际应用示例

 

电商系统订单表设计:

CREATE TABLE orders (
    order_id BIGINT AUTO_INCREMENT PRIMARY KEY,
    order_no VARCHAR(20) UNIQUE,
    customer_id INT NOT NULL,
    order_date DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
 
CREATE TABLE order_details (
    order_id BIGINT,
    product_id INT,
    quantity INT NOT NULL,
    price DECIMAL(10,2) NOT NULL,
    PRIMARY KEY (order_id, product_id),
    FOREIGN KEY (order_id) REFERENCES orders(order_id),
    FOREIGN KEY (product_id) REFERENCES products(product_id)
);

 

主键约束是数据库完整性的基石,合理设计主键能显著提高数据库性能和可维护性。

点赞(1)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)