【MySQL】表的约束

欢迎来到Cefler的博客😁

🕌博客主页:折纸花满衣

🏠个人专栏:MySQL


目录

👉🏻常见表的约束

在关系型数据库中,表的约束用于确保数据的完整性和一致性。以下是常见的表约束类型:

  1. 主键约束(Primary Key Constraint):主键是表中的唯一标识符,用于唯一标识表中的每一行。主键约束确保主键列中的值是唯一且不为空的。主键可以由单个列或多个列组成。

  2. 外键约束(Foreign Key Constraint):外键是一个表中的列,其值必须匹配另一个表中的主键或唯一键列的值。外键约束用于确保引用完整性,即确保在一个表中引用另一个表的数据时,引用的值必须存在于被引用表的主键或唯一键列中。

  3. 唯一约束(Unique Constraint):唯一约束确保表中的某个列或一组列中的值是唯一的,但允许其中的值为 NULL。唯一约束通常用于确保某些列中的值不重复,但允许其中的某些行具有空值。

  4. 检查约束(Check Constraint):检查约束用于确保列中的值满足特定的条件。例如,可以使用检查约束来确保年龄列中的值大于 18,或者确保电子邮件地址列中的值符合特定的格式。

  5. 默认约束(Default Constraint):默认约束用于为列中的值提供默认值。如果插入或更新操作没有提供值,则将使用默认值。默认约束可以确保表中的列始终具有一个已知的值。

这些约束可以单独使用,也可以结合在一起使用,以确保表中的数据满足特定的要求。它们在数据库设计中起着关键作用,有助于确保数据的完整性、一致性和可靠性。

👉🏻空属性NULL

空属性(NULL)和非空属性(NOT NULL)是用于定义列是否允许存储空值的约束。空值表示该列中没有存储任何数据,而非空值表示该列中必须存储有效的数据。

下面是它们的含义及示例 SQL 代码:

  1. NULL 属性:
    • NULL 表示缺少值或未知值。
    • 允许在列中存储空值。
    • 如果列允许 NULL,则插入或更新操作可以将该列的值设置为 NULL。
    • 在使用 NULL 进行比较时,通常需要使用 IS NULL 或 IS NOT NULL 运算符。

示例 SQL 代码:

sql 复制代码
CREATE TABLE Employees (
    EmployeeID INT PRIMARY KEY,
    FirstName VARCHAR(50),
    LastName VARCHAR(50),
    Email VARCHAR(100) NULL -- Email 列允许存储空值
);

INSERT INTO Employees (EmployeeID, FirstName, LastName, Email)
VALUES (1, 'John', 'Doe', NULL); -- 插入空值到 Email 列
  1. NOT NULL 属性:
    • NOT NULL 表示列不允许存储空值,必须始终包含有效的数据。
    • 插入或更新操作必须为 NOT NULL 列提供有效的值。
    • 如果尝试将 NULL 值插入 NOT NULL 列,则会导致错误。

示例 SQL 代码:

sql 复制代码
CREATE TABLE Students (
    StudentID INT PRIMARY KEY,
    FirstName VARCHAR(50) NOT NULL, -- FirstName 列不允许存储空值
    LastName VARCHAR(50) NOT NULL,
    Age INT
);

INSERT INTO Students (StudentID, FirstName, LastName, Age)
VALUES (1, 'Alice', 'Smith', 20); -- 插入有效值到 FirstName 和 LastName 列

INSERT INTO Students (StudentID, FirstName, LastName, Age)
VALUES (2, NULL, 'Doe', 22); -- 尝试插入 NULL 值到 FirstName 列,将会导致错误

在设计数据库时,正确使用 NULL 和 NOT NULL 属性可以确保数据的完整性和一致性,并帮助有效地处理缺少值或未知值的情况。

👉🏻default默认值

默认值(DEFAULT)是用于指定在插入新行时,如果未提供值,则将使用的默认值。默认值可以在创建表时指定,也可以在修改表结构时添加到列上。

下面是默认值的一些特点和示例 SQL 代码:

  1. 指定默认值:

    • 可以为列指定一个默认值,该值在插入新行时将自动应用。
    • 如果插入或更新操作没有为列提供值,则将使用默认值。
    • 默认值可以是常量、表达式或函数。
  2. 示例 SQL 代码:

sql 复制代码
CREATE TABLE Employees (
    EmployeeID INT PRIMARY KEY,
    FirstName VARCHAR(50),
    LastName VARCHAR(50),
    Email VARCHAR(100) DEFAULT '[email protected]' -- Email 列的默认值为 '[email protected]'
);

INSERT INTO Employees (EmployeeID, FirstName, LastName)
VALUES (1, 'John', 'Doe'); -- 在插入新行时未提供 Email 值,将使用默认值 '[email protected]'
  1. 修改默认值:
    • 可以使用 ALTER TABLE 语句修改列的默认值。
    • 修改默认值将影响后续的插入操作,但不会影响已存在的行。
sql 复制代码
ALTER TABLE Employees
ALTER COLUMN Email SET DEFAULT '[email protected]'; -- 将 Email 列的默认值修改为 '[email protected]'
  1. 移除默认值:
    • 通过将列的默认值设置为 NULL,可以将默认值移除。
    • 或者使用 ALTER TABLE 语句显式地删除默认值。
sql 复制代码
ALTER TABLE Employees
ALTER COLUMN Email DROP DEFAULT; -- 移除 Email 列的默认值

默认值在确保数据完整性的同时,也可以简化应用程序中对于缺失值的处理。通过合理地设置默认值,可以使数据库系统更加灵活地处理不同情况下的数据插入操作。

👉🏻zerofill

ZEROFILL 是 MySQL 中用于数值列的一种特性,它指定了当数值长度小于列定义的宽度时,MySQL 将用零来填充该数值,以达到指定的宽度。

下面是 ZEROFILL 的一些特点和示例:

  1. ZEROFILL 特性:

    • 当为数值列启用 ZEROFILL 特性时,MySQL 将在数值长度小于列定义的宽度时,用零来填充数值。
    • ZEROFILL 只适用于数值类型,如 INT、FLOAT、DOUBLE 等。
    • ZEROFILL 不改变数值的实际值,只是在显示时添加零以达到指定的宽度。
  2. 示例 SQL 代码:

sql 复制代码
CREATE TABLE Students (
    StudentID INT(6) ZEROFILL, -- 使用 ZEROFILL 特性
    FirstName VARCHAR(50),
    LastName VARCHAR(50),
    Age INT
);

INSERT INTO Students (StudentID, FirstName, LastName, Age)
VALUES (123, 'Alice', 'Smith', 20); -- 插入数值 123,但在显示时将会填充为 000123

在上面的示例中,如果 StudentID 列定义为 INT ZEROFILL,当插入的数值长度小于列定义的宽度时,MySQL 将在显示时用零来填充该数值。例如,插入数值 123 到 StudentID 列时,实际存储的值仍然是 123,但在查询结果中会以 000123 的形式显示。

ZEROFILL 特性可以在某些情况下提高数据的可读性,并使数据在显示时更加整齐,特别是在处理需要固定宽度的数值时。

👉🏻 主键

主键(Primary Key)在数据库中是用于唯一标识每一行数据的一列或一组列。主键的作用是确保表中的每一行都有一个唯一的标识符,这样可以方便地对数据进行检索、修改和删除。主键有以下几个重要特点:

  1. 唯一性:主键的值在整个表中必须是唯一的,每一行都必须具有唯一的主键值。

  2. 非空性:主键的值不能为 NULL,确保每一行都有一个有效的标识符。

  3. 不可变性:一旦主键值被设置,就不应该被修改或更新。这有助于维持数据的一致性和完整性。

  4. 单一性:一个表只能有一个主键,但主键可以由一个列或多个列组成,这种情况下称为复合主键。

  5. 必须稳定:主键值应该是稳定的,不随时间或上下文的变化而变化。

主键的设置可以带来以下好处:

  • 数据唯一性约束:通过主键,可以确保表中的每一行数据都具有唯一的标识,防止数据重复或冗余。

  • 数据检索效率提升:数据库系统会自动为主键创建索引,这样可以加快对数据的检索速度。

  • 数据一致性维护:主键的存在有助于维护数据的完整性和一致性,确保数据的正确性。

  • 外键关联:主键常常与外键一起使用,通过外键可以建立不同表之间的关联关系,实现数据的关联查询和引用完整性。

在设计数据库表时,选择合适的列作为主键是非常重要的。常用的主键选择包括唯一的标识符列(如自增长整数列),或者是能够唯一标识每一行数据的业务相关的列(如身份证号、学号等)。


当创建数据库表时,你可以指定某一列作为主键。以下是一个简单的示例代码,演示如何在 MySQL 中创建表并设置主键:

sql 复制代码
CREATE TABLE Users (
    UserID INT AUTO_INCREMENT, -- 设置自增长整数列
    Username VARCHAR(50) NOT NULL,
    Email VARCHAR(100) NOT NULL,
    Password VARCHAR(50) NOT NULL,
    PRIMARY KEY (UserID) -- 将 UserID 列设置为主键
);

在上面的示例中:

  • 我们创建了一个名为 Users 的表,其中包含 UserIDUsernameEmailPassword 四个列。
  • UserID 列被定义为 INT 类型,并且使用 AUTO_INCREMENT 关键字,这意味着每当插入新行时,UserID 的值将自动递增,确保每个用户都有一个唯一的标识符。
  • UsernameEmailPassword 列被定义为 VARCHAR 类型,并且都被指定为 NOT NULL,确保这些列的值不能为空。
  • 最后,我们使用 PRIMARY KEY 关键字将 UserID 列设置为主键,这意味着 UserID 列的值将在表中唯一标识每一行数据。

通过这样设置,我们确保了 Users 表中的每一行都具有唯一的 UserID,并且 UserID 会自动递增,同时还确保了 UsernameEmailPassword 列的值都不为空。


🏠当需要使用复合主键时,可以指定多个列作为主键的组合

以下是一个示例代码,演示如何在 MySQL 中创建一个表并设置复合主键:

sql 复制代码
CREATE TABLE Orders (
    OrderID INT AUTO_INCREMENT,
    CustomerID INT,
    OrderDate DATE,
    TotalAmount DECIMAL(10,2),
    PRIMARY KEY (OrderID, CustomerID) -- 将 OrderID 和 CustomerID 列作为复合主键
);

在上面的示例中:

  • 我们创建了一个名为 Orders 的表,其中包含 OrderIDCustomerIDOrderDateTotalAmount 四个列。
  • OrderIDCustomerID 列被指定为主键,通过将它们包含在 PRIMARY KEY 关键字中,表示它们组成了复合主键。
  • OrderID 列被定义为 INT 类型,并使用 AUTO_INCREMENT 关键字,确保每个订单都有一个唯一的标识符。
  • CustomerID 列被定义为 INT 类型,用于标识订单的客户。
  • OrderDate 列被定义为 DATE 类型,用于记录订单的日期。
  • TotalAmount 列被定义为 DECIMAL 类型,用于记录订单的总金额。

通过这样设置,我们确保了 Orders 表中的每一行都具有唯一的 OrderIDCustomerID 组合,这样就可以唯一标识每个订单。

👉🏻自增长Auto Increment

自增长(Auto Increment)是一种数据库功能,通常用于为表中的某一列生成唯一的、递增的数值。这种功能常用于创建主键,以确保每一行数据都有一个唯一标识符。

在许多数据库管理系统中,如MySQL、PostgreSQL和SQLite等,都支持自增长功能。在MySQL中,常用的自增长关键字是 AUTO_INCREMENT

自增长列的特点包括:

  1. 唯一性: 自增长列生成的值是唯一的,每次插入新数据时,系统会自动为这一列生成一个比上一次插入的值大的新值,确保每个值都是唯一的。

  2. 递增性: 自增长列生成的值是递增的,每次插入新数据时,自增长列的值会自动递增,通常是加一。

  3. 简便性: 自增长列不需要手动指定值,数据库系统会自动为其生成一个唯一的、递增的值。

自增长列通常用于主键列的创建,以确保每个数据行都有一个唯一标识符,并且这个标识符是递增的,方便进行数据检索和管理。例如,在用户表中,可以将用户ID列设置为自增长列,确保每个用户都有一个唯一的、递增的用户ID。

自增长列可以通过以下示例代码来创建:

sql 复制代码
CREATE TABLE Users (
    UserID INT AUTO_INCREMENT,
    Username VARCHAR(50),
    Email VARCHAR(100),
    PRIMARY KEY (UserID)
);

在这个示例中,UserID 列被指定为自增长列,每次插入新数据时,数据库系统会自动为 UserID 生成一个唯一的、递增的值。

👉🏻唯一键

唯一键(Unique Key)是数据库中的一种约束,用于确保某一列或多列的值在表中是唯一的 ,但与主键的区别在于,唯一键允许为空值(NULL)。

唯一键的作用是保证某列或多列的值不重复,但允许其中的某些值为 NULL。这在某些情况下很有用,例如,一个用户表中的电子邮件地址列可以被定义为唯一键,这样就能确保每个用户都有一个唯一的电子邮件地址,但允许某些用户的电子邮件地址为空。

与主键相似,唯一键也可以由一个或多个列组成。如果是单列唯一键,那么该列中的每个值都必须是唯一的;如果是多列唯一键,则这些列的组合值必须是唯一的。

在创建表时,可以使用 UNIQUE 关键字来定义唯一键约束。以下是一个示例代码,演示如何在 MySQL 中创建一个具有唯一键约束的表:

sql 复制代码
CREATE TABLE Users (
    UserID INT AUTO_INCREMENT,
    Username VARCHAR(50),
    Email VARCHAR(100) UNIQUE,
    PRIMARY KEY (UserID)
);

在这个示例中,我们将 Email 列定义为唯一键,这意味着每个用户的电子邮件地址必须是唯一的,但允许某些用户的电子邮件地址为空。同时,UserID 列被定义为主键,确保每个用户都有一个唯一的用户ID

👉🏻外键

外键(Foreign Key)是关系型数据库中的一种约束,用于建立表与表之间的关联关系。外键用于指定一个表中的列或列组合,这些列的值必须在另一个表的指定列中存在。

外键约束可以确保数据的一致性和完整性,通过强制执行参照完整性,确保了在一个表中引用另一个表的数据时的准确性和有效性。

以下是外键的一些重要特点:

  1. 建立关联关系: 外键用于建立表与表之间的关联关系,通过在一个表中引用另一个表的列,可以实现跨表的数据关联。

  2. 保持一致性: 外键约束可以确保在进行关联查询或更新操作时,参与关联的表之间的数据保持一致性。

  3. 参照完整性: 外键约束强制执行参照完整性,确保在引用另一个表的列时,引用列的值必须存在于被引用表的主键或唯一键列中。

  4. 级联操作: 外键约束可以定义级联操作,例如级联更新或级联删除,以确保在更新或删除主表中的数据时,相关的从表数据也会被更新或删除。

在创建表时,可以使用 FOREIGN KEY 关键字来定义外键约束。以下是一个示例代码,演示如何在 MySQL 中创建一个具有外键约束的表:

sql 复制代码
CREATE TABLE Orders (
    OrderID INT AUTO_INCREMENT,
    ProductID INT,
    Quantity INT,
    PRIMARY KEY (OrderID),
    FOREIGN KEY (ProductID) REFERENCES Products(ProductID)
);

在这个示例中,Orders 表中的 ProductID 列被定义为外键,它引用了另一个表 Products 中的 ProductID 列。这意味着在插入或更新 Orders 表中的数据时,ProductID 列的值必须存在于 Products 表的 ProductID 列中。


如上便是本期的所有内容了,如果喜欢并觉得有帮助的话,希望可以博个点赞+收藏+关注🌹🌹🌹❤️ 🧡 💛,学海无涯苦作舟,愿与君一起共勉成长

相关推荐
技术宝哥2 小时前
Redis(2):Redis + Lua为什么可以实现原子性
数据库·redis·lua
学地理的小胖砸3 小时前
【Python 操作 MySQL 数据库】
数据库·python·mysql
dddaidai1233 小时前
Redis解析
数据库·redis·缓存
数据库幼崽3 小时前
MySQL 8.0 OCP 1Z0-908 121-130题
数据库·mysql·ocp
Amctwd4 小时前
【SQL】如何在 SQL 中统计结构化字符串的特征频率
数据库·sql
betazhou4 小时前
基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL
linux·数据库·mysql·oracle·ogg
lyrhhhhhhhh5 小时前
Spring 框架 JDBC 模板技术详解
java·数据库·spring
喝醉的小喵6 小时前
【mysql】并发 Insert 的死锁问题 第二弹
数据库·后端·mysql·死锁
付出不多7 小时前
Linux——mysql主从复制与读写分离
数据库·mysql
初次见面我叫泰隆7 小时前
MySQL——1、数据库基础
数据库·adb