深入理解 MySQL 主键:从建表到查询的全面剖析

admin 9781

引言

在数据库管理中,主键是一个至关重要的概念。它就像现实生活中的身份证号码,能够唯一标识数据库表中的每一行记录。正确使用主键可以提高数据的完整性和查询效率。本文将通过实际的 SQL 代码示例,从建表到查询,详细阐述主键的作用和使用方法。

一、建表时定义主键

1.1 创建用户信息表

CREATE TABLE user_info (

id INT AUTO_INCREMENT PRIMARY KEY, -- 主键,自增整数

username VARCHAR(50) NOT NULL, -- 用户名,字符串,非空

age TINYINT, -- 年龄,小整数

email VARCHAR(100) UNIQUE, -- 邮箱,字符串,唯一值

create_time DATETIME DEFAULT NOW() -- 创建时间,默认当前时间

);

在这个 user_info 表中,id 列被定义为主键,并且使用了 AUTO_INCREMENT 属性,这意味着每次插入新记录时,id 会自动递增。主键的作用是确保每一行记录都有一个唯一的标识符,方便后续的数据操作。

不过,这里有一个小插曲,我们进行了一些实验,使用了 use sys; 和 use cainiaojioacheng; 语句,之后将这个表删除了,DROP TABLE user_info;。

1.2 建立业务相关表

1.2.1 客户表

CREATE TABLE customers(

customer_id INT AUTO_INCREMENT PRIMARY KEY,

first_name VARCHAR(50) NOT NULL,

last_name VARCHAR(50) NOT NULL,

email VARCHAR(100) UNIQUE NOT NULL

);

在 customers 表中,customer_id 作为主键,它能唯一区分不同的客户。同时,email 列使用了 UNIQUE 约束,确保每个客户的邮箱地址是唯一的。

1.2.2 产品表

CREATE TABLE products (

product_id INT AUTO_INCREMENT PRIMARY KEY,

product_name VARCHAR(100) NOT NULL,

price DECIMAL(10, 2) NOT NULL

);

products 表中,product_id 是主键,用于唯一标识每个产品。

1.2.3 订单表

CREATE TABLE orders (

order_id INT AUTO_INCREMENT PRIMARY KEY,

customer_id INT,

order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

FOREIGN KEY (customer_id) REFERENCES customers(customer_id)

);

orders 表的主键是 order_id,同时通过 FOREIGN KEY 约束建立了与 customers 表的关联,customer_id 引用了 customers 表中的 customer_id,这体现了主键在关联表中的重要作用,确保数据的一致性和关联性。

1.2.4 订单详情表

CREATE TABLE order_details (

order_detail_id INT AUTO_INCREMENT PRIMARY KEY,

order_id INT,

product_id INT,

quantity INT NOT NULL,

FOREIGN KEY (order_id) REFERENCES orders(order_id),

FOREIGN KEY (product_id) REFERENCES products(product_id)

);

order_details 表的主键是 order_detail_id,并且通过外键分别关联了 orders 表和 products 表,这样可以清晰地记录每个订单包含的产品信息。

二、向表中插入数据

2.1 插入客户数据

INSERT INTO customers (first_name, last_name, email)

VALUES

('Alice', 'Johnson', 'alice.johnson@example.com'),

('Bob', 'Williams', 'bob.williams@example.com'),

('Charlie', 'Brown', 'charlie.brown@example.com');

通过 INSERT INTO 语句向 customers 表中插入了三条客户记录,由于 customer_id 是自增主键,数据库会自动为每条记录分配一个唯一的 customer_id。

2.2 插入产品数据

INSERT INTO products (product_name, price)

VALUES

('Smartphone', 499.99),

('Laptop', 999.99),

('Headphones', 79.99),

('Tablet', 299.99);

同样地,向 products 表中插入了四条产品记录,product_id 会自动递增。

2.3 插入订单数据

-- 客户 Alice(customer_id = 1)下了两个订单

INSERT INTO orders (customer_id)

VALUES

(1),

(1);

-- 客户 Bob(customer_id = 2)下了一个订单

INSERT INTO orders (customer_id)

VALUES

(2);

这里为不同客户插入了订单记录,order_id 会自动生成唯一值。

2.4 插入订单详情数据

-- 客户 Alice 的第一个订单(order_id = 1)包含一部智能手机和一副耳机

INSERT INTO order_details (order_id, product_id, quantity)

VALUES

(1, 1, 1),

(1, 3, 1);

-- 客户 Alice 的第二个订单(order_id = 2)包含一台笔记本电脑

INSERT INTO order_details (order_id, product_id, quantity)

VALUES

(2, 2, 1);

-- 客户 Bob 的订单(order_id = 3)包含一台平板电脑

INSERT INTO order_details (order_id, product_id, quantity)

VALUES

(3, 4, 1);

向 order_details 表中插入了订单详情记录,通过关联 order_id 和 product_id,可以清晰地了解每个订单包含的产品信息。

三、查询数据并体验主键的作用

3.1 查询所有表的数据

-- 查询客户表数据

SELECT * FROM customers;

-- 查询产品表数据

SELECT * FROM products;

-- 查询订单表数据

SELECT * FROM orders;

-- 查询订单详情表数据

SELECT * FROM order_details;

通过这些查询语句,可以查看各个表中的所有记录,直观地看到主键在标识记录方面的作用。

3.2 通过主键精准查询客户信息

-- 插入更多客户记录

INSERT INTO customers(first_name,last_name,email) VALUES ('John','Doe','John.doe@example.com');

INSERT INTO customers (first_name,last_name,email) VALUES ('Jane','Smith','Jane.smith@example.com');

INSERT INTO customers (first_name, last_name, email) VALUES ('gangzi','yaling','gangzi@qq.com');

INSERT INTO customers(first_name, last_name, email) VALUES ('何亚玲','赵志刚','3108258523@qq.com');

-- 查询客户信息,通过主键可以精准找到一个客户

SELECT * FROM customers WHERE customer_id = 1;

这里先插入了更多的客户记录,然后通过 WHERE 子句结合主键 customer_id 进行查询,可以精准地找到指定的客户记录,这充分体现了主键在查询中的重要性。

四、总结

主键在数据库中扮演着不可或缺的角色。在建表时,合理定义主键可以确保数据的完整性和唯一性;在插入数据时,主键能够自动分配唯一标识,简化数据操作;在查询数据时,通过主键可以快速、精准地定位到所需的记录。通过本文的示例,相信你对主键的作用和使用方法有了更深入的理解,在实际的数据库开发中,要充分利用主键的特性,提高数据库的性能和数据管理的效率。

希望这篇文章能帮助你更好地理解 MySQL 中的主键,如果你在实践过程中有任何问题,欢迎在评论区留言讨论。