这些约束作用于表的行和列,限制了数据的取值范围和操作方式
本文将详细介绍MySQL中的主要约束类型,并通过示例展示其用法和作用
一、约束的基本概念 约束是一种限制,用于确保数据库表中数据的准确性和一致性
在创建表或修改表结构时,可以添加不同类型的约束来限制数据的输入和修改
如果任何操作违反了约束规则,该操作将被中止,从而保护数据的完整性
MySQL中的约束主要分为以下几类: 1.主键约束(PRIMARY KEY) 2.外键约束(FOREIGN KEY) 3.唯一约束(UNIQUE) 4.非空约束(NOT NULL) 5.默认值约束(DEFAULT) 6.自增长约束(AUTO_INCREMENT) 7.无符号约束(UNSIGNED) 8.零填充约束(ZEROFILL) 9.检查约束(CHECK,MySQL 8.0.16及以后版本支持) 10.级联约束 此外,还有一些其他类型的约束,如索引约束和空间约束,但在本文中,我们将主要讨论上述常见的约束类型
二、主键约束(PRIMARY KEY) 主键约束用于唯一标识表中的每一行
它隐含了非空(NOT NULL)和唯一(UNIQUE)约束,即主键列的值不能为NULL,也不能重复
一个表只能有一个主键,但主键可以是单列或多列组合(复合主键)
示例: sql CREATE TABLE orders( order_id INT PRIMARY KEY, customer_id INT, order_date DATE ); 在上面的示例中,`order_id`列被设为主键,这意味着该列的值必须唯一且非空
三、外键约束(FOREIGN KEY) 外键约束用于在两个表之间建立连接,并强制引用完整性
它确保子表(包含外键的表)中的外键列的值必须在父表(被引用的表)的某个主键或唯一键列中存在
如果外键列允许NULL值,则也可以为NULL
示例: sql CREATE TABLE customers( customer_id INT PRIMARY KEY, customer_name VARCHAR(100) ); CREATE TABLE orders( order_id INT PRIMARY KEY, customer_id INT, order_date DATE, CONSTRAINT fk_customer FOREIGN KEY(customer_id) REFERENCES customers(customer_id) ); 在上面的示例中,`orders`表中的`customer_id`列是外键,它引用了`customers`表中的`customer_id`列
这确保了`orders`表中的每个订单都必须关联到一个有效的客户
四、唯一约束(UNIQUE) 唯一约束用于确保列(或列组合)中的所有值都是唯一的
允许存在一个NULL值(除非该列也被定义为NOT NULL)
唯一约束通常通过唯一索引实现
示例: sql CREATE TABLE employees( emp_id INT PRIMARY KEY, emp_name VARCHAR(100), email VARCHAR(100) UNIQUE ); 在上面的示例中,`email`列被设为唯一约束,这意味着每个员工的电子邮件地址必须是唯一的
五、非空约束(NOT NULL) 非空约束用于确保列中的值不能为NULL
在插入或更新记录时,必须为该列提供一个值
示例: sql CREATE TABLE users( id INT PRIMARY KEY, username VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL ); 在上面的示例中,`username`和`email`列都被设为非空约束,这意味着在插入或更新用户记录时,这些列必须有值
六、默认值约束(DEFAULT) 默认值约束允许为表中的列指定一个默认值
如果在插入记录时没有为该列提供值,MySQL将自动使用默认值填充该列
示例: sql CREATE TABLE students( student_id INT PRIMARY KEY, student_name VARCHAR(100), enrollment_date DATE DEFAULT CURRENT_DATE ); 在上面的示例中,`enrollment_date`列被设为默认值约束,如果在插入学生记录时没有提供`enrollment_date`的值,MySQL将自动使用当前日期填充该列
七、自增长约束(AUTO_INCREMENT) 自增长约束用于为整数列自动生成一个唯一的序列号
通常与主键一起使用
当插入新行时,如果未指定该列的值,MySQL会自动为其生成一个比当前最大值大1的唯一序列号
示例: sql CREATE TABLE logs( log_id INT AUTO_INCREMENT PRIMARY KEY, log_message TEXT, log_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); 在上面的示例中,`log_id`列被设为自增长约束和主键,每次插入新日志记录时,`log_id`都会自动递增
八、无符号约束(UNSIGNED) 无符号约束指定当前列的数值为非负数
对于整数类型列,无符号约束可以扩大其正数取值范围
示例: sql CREATE TABLE products( product_id INT PRIMARY KEY, price DECIMAL(10,2) UNSIGNED ); 在上面的示例中,`price`列被设为无符号约束,这意味着该列的值必须是非负数
九、零填充约束(ZEROFILL) 零填充约束用于在数值型数据的显示中,如果位数不够,则在前面补零
这对于需要固定位数显示的数值非常有用
示例: sql CREATE TABLE orders( order_id INT ZEROFILL PRIMARY KEY, customer_id INT ); 在上面的示例中,`order_id`列被设为零填充约束,如果插入的订单ID为5,则显示时将为0000000005
十、检查约束(CHECK,MySQL8.0.16及以后版本支持) 检查约束用于限制列中可以放置的取值范围
它允许为列指定一个条件表达式,只有满足该条件的值才被允许插入或更新到列中
示例(MySQL 8.0.16及以后版本): sql CREATE