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

第一部分:基础知识 4. 约束 --[MySQL轻松入门教程]

MySQL中的约束(Constraints)是用来定义表中数据的规则,以确保数据的完整性和一致性。以下是几种常见的MySQL约束类型及其详细说明:

1.主键约束 (PRIMARY KEY)

在MySQL中,主键约束(PRIMARY KEY)用于唯一标识表中的每一行数据。它确保了列或列组合的值在整个表中是唯一的,并且不允许有NULL值。下面通过几个示例来展示如何在创建表时定义主键约束,以及如何在已有表上添加或修改主键。

创建新表时定义主键

假设我们要创建一个名为Employees的表,其中包含员工ID、姓名等信息。我们想要将EmployeeID字段设置为主键。

CREATE TABLE Employees (
    EmployeeID INT AUTO_INCREMENT,  -- 自动增长的整数
    FirstName VARCHAR(50) NOT NULL,
    LastName VARCHAR(50) NOT NULL,
    HireDate DATE,
    PRIMARY KEY (EmployeeID)  -- 将EmployeeID设置为主键
);

在这里插入图片描述

在这个例子中,EmployeeID字段被定义为自动增长的整型,并作为主键。这意味着每次插入新记录时,如果没有指定EmployeeID的具体值,MySQL会自动为其分配一个新的唯一的数字。

在已存在的表上添加主键

如果已经有一个表,但没有设置主键,可以通过ALTER TABLE语句来添加。例如,对一个名为Departments的表添加主键:

ALTER TABLE Departments
ADD PRIMARY KEY (DepartmentID);

这里假定Departments表中有一个DepartmentID字段,我们希望将其设为主键。

使用多个字段作为复合主键

有时可能需要使用两个或更多的字段共同作为主键。这通常发生在单独的任何一个字段都不能保证唯一性的情况下。例如,对于一个记录课程注册情况的表CourseRegistrations,我们可以使用StudentIDCourseID作为联合主键:

CREATE TABLE CourseRegistrations (
    StudentID INT,
    CourseID INT,
    RegistrationDate DATE,
    PRIMARY KEY (StudentID, CourseID)  -- 复合主键
);

在这里插入图片描述

在这个例子中,StudentIDCourseID一起构成了表的主键,确保了每一对学生-课程组合都是唯一的。

删除主键

如果需要移除某个表的主键,可以使用如下命令:

ALTER TABLE Employees
DROP PRIMARY KEY;

这条命令将会删除Employees表上的现有主键。请注意,在执行此操作之前,请确保这样做不会影响到数据库的整体结构和完整性,比如如果有外键依赖于这个主键的话,那么先需要处理好这些依赖关系。

以上就是关于MySQL中主键约束的一些基本操作示例。正确使用主键可以帮助保持数据的一致性和完整性。

2.唯一性约束 (UNIQUE)

在MySQL中,唯一性约束(UNIQUE)确保一列或多列组合的值在整个表中是唯一的。这与主键约束有些相似,但不同之处在于唯一性约束允许包含NULL值,并且一个表可以有多个唯一性约束。下面通过几个示例来展示如何在创建表时定义唯一性约束,以及如何在已有表上添加或修改唯一性约束。

创建新表时定义唯一性约束

假设我们要创建一个名为Users的表,其中包含用户的邮箱地址等信息。我们希望确保每个用户的邮箱地址都是唯一的。

CREATE TABLE Users (
    UserID INT AUTO_INCREMENT,
    FirstName VARCHAR(50) NOT NULL,
    LastName VARCHAR(50) NOT NULL,
    Email VARCHAR(100),
    PRIMARY KEY (UserID),
    UNIQUE (Email)  -- 确保Email字段的值是唯一的
);

在这里插入图片描述

在这个例子中,Email字段被设置为具有唯一性约束,这意味着任何两个不同的用户不能拥有相同的电子邮件地址。

在已存在的表上添加唯一性约束

如果已经有一个表,但没有设置唯一性约束,可以通过ALTER TABLE语句来添加。例如,对一个名为Products的表添加唯一性约束:

ALTER TABLE Products
ADD CONSTRAINT unique_product_code UNIQUE (ProductCode);

ALTER TABLE Products:指定要修改的表名。
ADD CONSTRAINT unique_product_code:添加一个新的约束,并给这个约束命名。这里的名字unique_product_code是可选的,但它有助于以后引用或删除该约束时更容易识别。
UNIQUE (ProductCode):定义ProductCode字段上的唯一性约束,确保该字段中的所有值都是唯一的。

使用多个字段作为复合唯一性约束

有时可能需要使用两个或更多的字段共同构成唯一性约束。这通常发生在单独的任何一个字段都不能保证唯一性的情况下。例如,对于一个记录订单详情的表OrderDetails,我们可以使用OrderIDProductID作为联合唯一性约束:

CREATE TABLE OrderDetails (
    OrderDetailID INT AUTO_INCREMENT,
    OrderID INT,
    ProductID INT,
    Quantity INT,
    PRIMARY KEY (OrderDetailID),
    UNIQUE (OrderID, ProductID)  -- 复合唯一性约束
);

在这里插入图片描述

在这个例子中,OrderIDProductID一起构成了表的唯一性约束,确保了每一对订单-产品组合都是唯一的。

在这里插入图片描述

删除唯一性约束

如果需要移除某个表上的唯一性约束,可以使用如下命令:

首先,你需要找到唯一性约束的名字。你可以通过查询INFORMATION_SCHEMA.TABLE_CONSTRAINTS来获取:

SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE TABLE_NAME = 'OrderDetails' AND CONSTRAINT_TYPE = 'UNIQUE';

在这里插入图片描述

然后使用ALTER TABLE语句删除该约束,例如:

ALTER TABLE YourTableName
DROP INDEX YourConstraintName;

或者直接指定约束名称(如果知道的话):

ALTER TABLE YourTableName
DROP CONSTRAINT YourConstraintName;

请注意,在执行此操作之前,请确保这样做不会影响到数据库的整体结构和完整性,特别是如果有其他逻辑依赖于这些唯一性约束的话。

以上就是关于MySQL中唯一性约束的一些基本操作示例。正确使用唯一性约束可以帮助保持数据的一致性和避免重复数据。

3.外键约束 (FOREIGN KEY)

在MySQL中,外键约束(FOREIGN KEY)用于确保两个表之间的引用完整性。外键约束可以防止在子表中插入不存在于父表中的数据,并且可以在删除或更新父表中的记录时控制子表的行为。下面通过几个示例来展示如何在创建表时定义外键约束,以及如何在已有表上添加或修改外键约束。

创建新表时定义外键约束

假设我们有两个表:DepartmentsEmployeesDepartments表存储部门信息,而Employees表存储员工信息。每个员工属于一个部门,因此我们需要在Employees表中设置一个外键,引用Departments表的主键。

创建Departments
CREATE TABLE Departments (
    DepartmentID INT AUTO_INCREMENT,
    DepartmentName VARCHAR(100) NOT NULL,
    PRIMARY KEY (DepartmentID)
);
创建Employees表并添加外键约束
CREATE TABLE Employees (
    EmployeeID INT AUTO_INCREMENT,
    FirstName VARCHAR(50) NOT NULL,
    LastName VARCHAR(50) NOT NULL,
    DepartmentID INT,
    PRIMARY KEY (EmployeeID),
    FOREIGN KEY (DepartmentID) REFERENCES Departments(DepartmentID)  -- 外键约束
);

在这里插入图片描述

在这个例子中,Employees表中的DepartmentID字段被定义为外键,它引用了Departments表的DepartmentID字段。这意味着只有当Departments表中存在相应的DepartmentID时,才能在Employees表中插入新的员工记录。

在已存在的表上添加外键约束

如果已经有一个表,但没有设置外键约束,可以通过ALTER TABLE语句来添加。例如,假设我们已经有了OrdersCustomers两个表,现在想在Orders表上添加一个外键约束,引用Customers表的CustomerID字段。

假设Customers表如下:
CREATE TABLE Customers (
    CustomerID INT AUTO_INCREMENT,
    CustomerName VARCHAR(100) NOT NULL,
    PRIMARY KEY (CustomerID)
);
假设Orders表如下:
CREATE TABLE Orders (
    OrderID INT AUTO_INCREMENT,
    OrderDate DATE,
    CustomerID INT,
    PRIMARY KEY (OrderID)
);
添加外键约束
ALTER TABLE Orders
ADD CONSTRAINT fk_orders_customers
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID);

这里,我们在Orders表上添加了一个名为fk_orders_customers的外键约束,它引用了Customers表的CustomerID字段。

控制外键行为

外键约束还允许你指定当删除或更新父表中的记录时,子表中的相关记录应该如何处理。这可以通过ON DELETEON UPDATE子句来实现。常见的选项包括:

  • CASCADE:当父表中的记录被删除或更新时,子表中的相关记录也会被自动删除或更新。
  • SET NULL:当父表中的记录被删除或更新时,子表中的相关记录的外键字段会被设置为NULL。
  • NO ACTIONRESTRICT:默认行为,阻止删除或更新父表中的记录,除非子表中没有相关记录。
  • SET DEFAULT:当父表中的记录被删除或更新时,子表中的相关记录的外键字段会被设置为默认值。
示例:使用ON DELETE CASCADE
ALTER TABLE Orders
ADD CONSTRAINT fk_orders_customers
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
ON DELETE CASCADE;

在这个例子中,如果Customers表中的某个客户被删除,那么Orders表中所有与该客户相关的订单记录也会被自动删除。

删除外键约束

如果需要移除某个表上的外键约束,可以使用如下命令:

首先,你需要知道外键约束的名字。你可以通过查询INFORMATION_SCHEMA.KEY_COLUMN_USAGE来获取:

SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = 'YourTableName' AND REFERENCED_TABLE_NAME IS NOT NULL;

然后使用ALTER TABLE语句删除该约束,例如:

ALTER TABLE YourTableName
DROP FOREIGN KEY YourConstraintName;

或者直接指定约束名称(如果知道的话):

ALTER TABLE Orders
DROP FOREIGN KEY fk_orders_customers;

以上就是关于MySQL中外键约束的一些基本操作示例。正确使用外键约束可以帮助保持数据库的数据完整性和一致性。

4.非空约束 (NOT NULL)

在MySQL中,非空约束(NOT NULL)用于确保列中的每个记录都必须包含一个值,即不允许该列存储NULL值。这对于确保数据完整性非常有用,特别是对于那些必须总是有值的字段,如用户的姓名、电子邮件地址等。

创建新表时定义非空约束

假设我们要创建一个名为Users的表,其中包含用户的基本信息,并且我们希望确保FirstNameLastName字段不能为空。

CREATE TABLE Users (
    UserID INT AUTO_INCREMENT,
    FirstName VARCHAR(50) NOT NULL,  -- 非空约束
    LastName VARCHAR(50) NOT NULL,   -- 非空约束
    Email VARCHAR(100),
    RegistrationDate DATE,
    PRIMARY KEY (UserID)
);

在这里插入图片描述

在这个例子中,FirstNameLastName字段被定义为非空,这意味着在插入或更新记录时,这两个字段必须提供具体的值,不能是NULL。

在已存在的表上添加非空约束

如果已经有一个表,但某些字段没有设置非空约束,可以通过ALTER TABLE语句来添加。例如,假设我们已经有了一个Employees表,现在想将Email字段设置为非空。

假设Employees表如下:
CREATE TABLE Employees (
    EmployeeID INT AUTO_INCREMENT,
    FirstName VARCHAR(50),
    LastName VARCHAR(50),
    Email VARCHAR(100),
    HireDate DATE,
    PRIMARY KEY (EmployeeID)
);
添加非空约束
ALTER TABLE Employees
MODIFY Email VARCHAR(100) NOT NULL;

这条命令将Email字段修改为非空。需要注意的是,在执行此操作之前,确保Email字段中没有任何NULL值,否则命令会失败。你可以先运行以下查询来检查是否有NULL值:

SELECT * FROM Employees WHERE Email IS NULL;

如果有NULL值,你需要先处理这些记录,例如通过更新它们或者删除这些记录。

删除非空约束

如果你需要移除某个表上的非空约束,可以使用ALTER TABLE语句来修改字段定义。例如,如果要移除Email字段的非空约束:

ALTER TABLE Employees
MODIFY Email VARCHAR(100) NULL;

这条命令将Email字段修改为允许NULL值。

示例总结

  • 创建新表时定义非空约束:在创建表时直接指定字段为NOT NULL
  • 在已有表上添加非空约束:使用ALTER TABLE ... MODIFY语句将字段修改为NOT NULL
  • 删除非空约束:使用ALTER TABLE ... MODIFY语句将字段修改为允许NULL值。

通过正确使用非空约束,可以确保数据库中的关键字段始终包含有效数据,从而提高数据质量和一致性。

5.默认值约束 (DEFAULT)

在MySQL中,默认值约束(DEFAULT)用于为列提供一个预设值。当插入新记录时,如果没有为该列指定具体值,数据库将自动使用默认值。这有助于确保数据的一致性和完整性。

创建新表时定义默认值约束

假设我们要创建一个名为Employees的表,其中包含员工的基本信息,并且我们希望某些字段有默认值。

CREATE TABLE Employees (
    EmployeeID INT AUTO_INCREMENT,
    FirstName VARCHAR(50) NOT NULL,
    LastName VARCHAR(50) NOT NULL,
    Email VARCHAR(100),
    HireDate DATE DEFAULT CURRENT_DATE,  -- 默认值为当前日期
    Department VARCHAR(50) DEFAULT 'General',  -- 默认值为'General'
    PRIMARY KEY (EmployeeID)
);

在这个例子中:

  • HireDate 字段的默认值是当前日期。
  • Department 字段的默认值是 'General'

在已存在的表上添加默认值约束

如果已经有一个表,但某些字段没有设置默认值,可以通过ALTER TABLE语句来添加。例如,假设我们已经有了一个Products表,现在想为Price字段添加一个默认值。

假设Products表如下:
CREATE TABLE Products (
    ProductID INT AUTO_INCREMENT,
    ProductName VARCHAR(100) NOT NULL,
    Price DECIMAL(10, 2),
    PRIMARY KEY (ProductID)
);
添加默认值约束
ALTER TABLE Products
ALTER COLUMN Price SET DEFAULT 0.00;  -- 设置默认值为0.00

这条命令将Price字段的默认值设置为 0.00。这意味着在插入新记录时,如果没有指定Price的具体值,它将自动被设置为 0.00

删除默认值约束

如果你需要移除某个字段的默认值,可以使用ALTER TABLE语句来删除默认值。例如,如果要移除Price字段的默认值:

ALTER TABLE Products
ALTER COLUMN Price DROP DEFAULT;

这条命令将移除Price字段的默认值。

示例总结

  • 创建新表时定义默认值约束:在创建表时直接指定字段的默认值。
  • 在已有表上添加默认值约束:使用ALTER TABLE ... ALTER COLUMN ... SET DEFAULT语句。
  • 删除默认值约束:使用ALTER TABLE ... ALTER COLUMN ... DROP DEFAULT语句。

通过正确使用默认值约束,可以确保在插入新记录时,即使没有显式提供某些字段的值,也能保证这些字段具有合理的默认值,从而提高数据的一致性和完整性。

完整示例

以下是一个完整的示例,展示了如何创建一个带有默认值约束的表,以及如何在已有表上添加和删除默认值约束。

创建表并设置默认值
-- 创建带有默认值的表
CREATE TABLE Employees (
    EmployeeID INT AUTO_INCREMENT,
    FirstName VARCHAR(50) NOT NULL,
    LastName VARCHAR(50) NOT NULL,
    Email VARCHAR(100),
    HireDate DATE DEFAULT (CURRENT_DATE),
    Department VARCHAR(50) DEFAULT 'General',
    PRIMARY KEY (EmployeeID)
);

-- 插入数据,不指定HireDate和Department
INSERT INTO Employees (FirstName, LastName, Email) VALUES ('John', 'Doe', 'john.doe@example.com');

-- 查询数据
SELECT * FROM Employees;

在这里插入图片描述

在已有表上添加默认值
-- 创建一个没有默认值的表
CREATE TABLE Products (
    ProductID INT AUTO_INCREMENT,
    ProductName VARCHAR(100) NOT NULL,
    Price DECIMAL(10, 2),
    PRIMARY KEY (ProductID)
);

-- 插入数据,不指定Price
INSERT INTO Products (ProductName) VALUES ('Laptop');

-- 查询数据
SELECT * FROM Products;

-- 添加默认值
ALTER TABLE Products
ALTER COLUMN Price SET DEFAULT 0.00;

-- 再次插入数据,不指定Price
INSERT INTO Products (ProductName) VALUES ('Smartphone');

-- 查询数据
SELECT * FROM Products;

在这里插入图片描述

删除默认值
-- 删除默认值
ALTER TABLE Products
ALTER COLUMN Price DROP DEFAULT;

-- 再次插入数据,不指定Price
INSERT INTO Products (ProductName) VALUES ('Tablet');

-- 查询数据
SELECT * FROM Products;

通过这些示例,你可以看到如何在MySQL中有效地使用默认值约束。

了解并正确使用这些约束对于维护数据库的数据质量和结构是非常重要的。每种约束都有其特定的作用场景,在设计数据库架构时应当根据实际需求选择合适的约束类型。


http://www.kler.cn/a/421996.html

相关文章:

  • 深度学习——损失函数与BP算法
  • C#里怎么样快速判断一个数是否为2多少次方的数?
  • 小米-NLP算法工程师面试题
  • PostgreSQL添加PostGIS扩展和存储坐标
  • 【二分查找】
  • 编程语言中什么是框架?什么是Cocoa?Foundation.framework的底层实现?Swift如何引入ObjC框架?
  • ChatGPT和BERT区别和联系
  • PythonQt日常作业
  • 大数据新视界 -- Hive 与其他大数据工具的集成:协同作战的优势(下)(14/ 30)
  • IsaacSim以及IsaacLab的安装
  • 我的基金学习之路,从《解读基金——我的投资观与实践》开始
  • 【23种设计模式】单例模式:理论剖析与 Java 实践
  • Java学习分享
  • 中间件之Elasticsearch
  • 各种类型无人机性能及优缺点技术详解
  • 【乐企文件生成工程】搭建docker环境,使用docker部署工程
  • 【CSS in Depth 2 精译_800】附录A:CSS 选择器的含义及部分用法示例
  • 一次奇妙的getshell之旅
  • 数据结构--二叉树的创建和遍历
  • 28.100ASK_T113-PRO Linux+QT 显示一张照片