当前位置: 首页 > news >正文

MySQL约束

MySQL 约束是用于强制表中数据规则的机制,它们确保数据的准确性和可靠性。如果存在违反约束的数据操作,MySQL 会阻止该操作。

约束 描述 关键字
非空约束 限制该字段的数据不能为null NOT NULL
唯一约束 保证该字段的所有数据都是唯一、不重复的 UNIQUE
主键约束 主键是一行数据的唯一标识,要求非空且唯一 PRIMARY KEY
默认约束 保存数据时,如果未指定该字段的值,则采用默认值 DEFAULT
检查约束(8.0 .16版本之 保证字段值满足某一个条件 CHECK
外键约束 用来让两张表的数据之间建立连接,保证数据的一致 性和完整性 FOREIGN K

注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。

1、PRIMARY KEY 约束

唯一标识表中的每条记录,确保主键列的值既唯一又不为空。

示例

-- 创建表时定义单列主键
CREATE TABLE users (user_id INT PRIMARY KEY,username VARCHAR(50) NOT NULL,email VARCHAR(100)
);-- 创建表时定义多列复合主键
CREATE TABLE order_items (order_id INT,product_id INT,quantity INT,PRIMARY KEY (order_id, product_id)
);-- 使用ALTER TABLE添加主键
CREATE TABLE employees (emp_id INT,first_name VARCHAR(50),last_name VARCHAR(50)
);ALTER TABLE employees ADD PRIMARY KEY (emp_id);-- 使用CONSTRAINT命名主键
CREATE TABLE customers (cust_id INT,cust_name VARCHAR(100),CONSTRAINT pk_customers PRIMARY KEY (cust_id)
);-- 删除主键
ALTER TABLE employees DROP PRIMARY KEY;

2、FOREIGN KEY 约束

确保一个表中的数据匹配另一个表中的值,维护表之间的引用完整性。

示例

-- 创建表时定义外键
CREATE TABLE orders (order_id INT PRIMARY KEY,order_date DATE,customer_id INT,FOREIGN KEY (customer_id) REFERENCES customers(cust_id)
);-- 命名外键并指定操作
CREATE TABLE order_details (detail_id INT PRIMARY KEY,order_id INT,product_id INT,quantity INT,CONSTRAINT fk_orderFOREIGN KEY (order_id) REFERENCES orders(order_id)ON DELETE CASCADEON UPDATE CASCADE
);-- 使用ALTER TABLE添加外键
CREATE TABLE payments (payment_id INT PRIMARY KEY,order_id INT,amount DECIMAL(10,2)
);ALTER TABLE payments ADD CONSTRAINT fk_payment_order FOREIGN KEY (order_id) REFERENCES orders(order_id) ON DELETE SET NULL;-- 删除外键
ALTER TABLE payments DROP FOREIGN KEY fk_payment_order;

外键操作选项

  • ON DELETE CASCADE: 当父表中的记录被删除时,自动删除子表中的相关记录
  • ON DELETE SET NULL: 当父表中的记录被删除时,将子表中的外键设置为 NULL
  • ON DELETE RESTRICT: 阻止删除父表中的记录(默认
  • ON UPDATE CASCADE: 当父表中的主键更新时,自动更新子表中的外键

3、UNIQUE 约束

确保列中的所有值都是不同的。

示例

-- 创建表时定义唯一约束
CREATE TABLE products (product_id INT PRIMARY KEY,product_code VARCHAR(20) UNIQUE,product_name VARCHAR(100) NOT NULL
);-- 定义多列复合唯一约束
CREATE TABLE user_emails (user_id INT,email_type VARCHAR(20),email_address VARCHAR(100),UNIQUE (user_id, email_type)
);-- 命名唯一约束
CREATE TABLE departments (dept_id INT PRIMARY KEY,dept_name VARCHAR(100),CONSTRAINT uq_dept_name UNIQUE (dept_name)
);-- 使用ALTER TABLE添加唯一约束
ALTER TABLE employees ADD CONSTRAINT uq_employee_email UNIQUE (email);-- 删除唯一约束
ALTER TABLE employees DROP INDEX uq_employee_email;

4、NOT NULL 约束

确保列不能包含 NULL 值。
示例

-- 创建表时定义NOT NULL约束
CREATE TABLE students (student_id INT PRIMARY KEY,first_name VARCHAR(50) NOT NULL,last_name VARCHAR(50) NOT NULL,birth_date DATE NOT NULL,phone VARCHAR(15) NULL -- 明确指定可为NULL
);-- 使用ALTER TABLE添加NOT NULL约束
ALTER TABLE students MODIFY COLUMN phone VARCHAR(15) NOT NULL;-- 移除NOT NULL约束
ALTER TABLE students MODIFY COLUMN phone VARCHAR(15) NULL;

5、CHECK 约束 (MySQL 8.0.16+)

确保列中的值满足指定的条件。
示例

-- 创建表时定义CHECK约束
CREATE TABLE employees (emp_id INT PRIMARY KEY,first_name VARCHAR(50) NOT NULL,last_name VARCHAR(50) NOT NULL,salary DECIMAL(10,2) CHECK (salary > 0),age INT CHECK (age >= 18 AND age <= 65)
);-- 命名CHECK约束
CREATE TABLE products (product_id INT PRIMARY KEY,product_name VARCHAR(100) NOT NULL,price DECIMAL(10,2),stock_quantity INT,CONSTRAINT chk_price CHECK (price >= 0),CONSTRAINT chk_stock CHECK (stock_quantity >= 0)
);-- 使用ALTER TABLE添加CHECK约束
ALTER TABLE employees ADD CONSTRAINT chk_salary CHECK (salary > 0);-- 删除CHECK约束
ALTER TABLE employees DROP CHECK chk_salary;

6、DEFAULT 约束

当没有为列指定值时,设置默认值。
示例

-- 创建表时定义DEFAULT约束
CREATE TABLE orders (order_id INT PRIMARY KEY,order_date DATE DEFAULT (CURRENT_DATE),status VARCHAR(20) DEFAULT 'Pending',total_amount DECIMAL(10,2) DEFAULT 0.00
);-- 使用ALTER TABLE添加DEFAULT约束
ALTER TABLE orders
ALTER COLUMN status SET DEFAULT 'Processing';-- 移除DEFAULT约束
ALTER TABLE orders
ALTER COLUMN status DROP DEFAULT;
http://www.agseo.cn/news/115/

相关文章:

  • 数据结构与算法-21.堆-排序
  • Avalonia 学习笔记01. Images Buttons(图片与按钮) (转载)
  • 【触想智能】工控一体机和PLC一体机的区别你知道吗?
  • JDK 24.0.1 下载安装教程与环境配置教程(Windows10/11超详细图文安装步骤)
  • XeLaTeX 介绍
  • PTA
  • 学习笔记-安全概述
  • Adobe Animate CC2018安装包下载与安装教程
  • AE苹果手机iPhone 17展示动画片头模板 App Promo Phone 17 Pro
  • 完整教程:以数据与自动化驱动实验室变革:智能化管理整体规划
  • Windows11新系统激活设置PIN码步骤转圈
  • 82、制作座位表
  • 工业硅2511
  • 人工智能时代的合规性:为什么强大的 CI/CD 基础很重要
  • 如何优雅地清理Hugging Face缓存到本地的模型文件(2025最新版)
  • Linux 进程上下文切换详解
  • 第十天 C#学习事件 021
  • 事半功倍是蠢蛋52 使用docker-compose.override.yml
  • Elasticsearch
  • MySQL单表查询DQL
  • PyQt5 之QMenu菜单栏
  • [TJOI2015] 概率论 题解
  • Linux进程与线程
  • 事半功倍是蠢蛋51 大上黑白屏反色
  • Linux 启动耗时优化 1s 内启动(RK3588 平台)
  • 周总结报告5
  • 使用模拟库进行测试的意义是什么?
  • MyEMS:开源领域的能源管理创新解决方案
  • 【Containerd交互命令】ctr、crictl常用基本命令
  • DAG Matters! GFlowNets Enhanced Explainer For Graph Neural Networks | |