【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 'unknown@example.com' -- Email 列的默认值为 'unknown@example.com'
);

INSERT INTO Employees (EmployeeID, FirstName, LastName)
VALUES (1, 'John', 'Doe'); -- 在插入新行时未提供 Email 值,将使用默认值 'unknown@example.com'
  1. 修改默认值:
    • 可以使用 ALTER TABLE 语句修改列的默认值。
    • 修改默认值将影响后续的插入操作,但不会影响已存在的行。
sql 复制代码
ALTER TABLE Employees
ALTER COLUMN Email SET DEFAULT 'noreply@example.com'; -- 将 Email 列的默认值修改为 'noreply@example.com'
  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 列中。


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

相关推荐
sdaxue.com1 小时前
帝国CMS:如何去掉帝国CMS登录界面的认证码登录
数据库·github·网站·帝国cms·认证码
o(╥﹏╥)2 小时前
linux(ubuntu )卡死怎么强制重启
linux·数据库·ubuntu·系统安全
阿里嘎多学长2 小时前
docker怎么部署高斯数据库
运维·数据库·docker·容器
Yuan_o_2 小时前
Linux 基本使用和程序部署
java·linux·运维·服务器·数据库·后端
Sunyanhui12 小时前
牛客网 SQL36查找后排序
数据库·sql·mysql
老王笔记2 小时前
MHA binlog server
数据库·mysql
lovelin+v175030409663 小时前
安全性升级:API接口在零信任架构下的安全防护策略
大数据·数据库·人工智能·爬虫·数据分析
DT辰白4 小时前
基于Redis的网关鉴权方案与性能优化
数据库·redis·缓存
2401_871213304 小时前
mysql高阶语句
数据库·mysql