PostgreSQL 违反检查约束:失败的行包含的内容

PostgreSQL 违反检查约束:失败的行包含的内容

在本文中,我们将介绍 PostgreSQL 数据库中的检查约束以及当违反这些约束时发生的情况。我们将讨论如何识别违反约束的行,并提供一些示例来说明不同类型的检查约束。

阅读更多:PostgreSQL 教程

检查约束简介

检查约束是一种用于保护数据库数据完整性的约束类型。它们定义了一个条件,该条件必须在插入或更新行时为真。如果违反了检查约束,PostgreSQL 将拒绝插入或更新操作,并返回一个错误。

检查约束可以定义在列级别或表级别。列级别的检查约束只适用于特定的列,而表级别的检查约束适用于整个表。

以下是一个使用列级别检查约束的示例:

CREATE TABLE employees (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    age INTEGER CHECK (age >= 18)
);
SQL

上述示例中,我们创建了一个名为 “employees” 的表,其中 “age” 列的值必须大于等于 18。如果试图插入一个年龄小于 18 的员工,PostgreSQL 将返回一个错误。

违反检查约束的错误消息

当违反检查约束时,PostgreSQL 将返回一个错误消息,其中包含有关违反约束的信息。

以下是一个违反检查约束时的错误消息示例:

ERROR: new row for relation "employees" violates check constraint "employees_age_check"
DETAIL: Failing row contains (1, John Doe, 16).
SQL

上述示例中,我们试图插入一个年龄为 16 的员工,违反了 “employees” 表上的检查约束。错误消息中明确指示违反约束的表和列,以及包含违反约束的行的值。

识别违反检查约束的行

当出现违反检查约束的错误时,我们可能需要快速找出具体哪一行违反了约束。在 PostgreSQL 中,我们可以使用 EXPLAINERRMOD 命令来识别违反检查约束的行。

以下是一个示例:

EXPLAIN (ERRMOD 'ERROR: new row for relation "employees" violates check constraint "employees_age_check"') 
SELECT * FROM employees WHERE age < 18;
SQL

此示例中,我们使用 ERRMOD 命令来模拟一个违反检查约束的错误消息。然后,我们查询 employees 表中违反该约束的行,以便找出具体哪一行违反了约束。

不同类型的检查约束

PostgreSQL 支持多种类型的检查约束,可以根据具体业务需求进行选择。以下是一些常见的检查约束类型:

唯一约束

唯一约束用于确保一列或一组列的值在表中是唯一的。唯一约束可用于保证数据的唯一性,例如唯一的用户名或身份证号码。

以下是一个唯一约束的示例:

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(100) UNIQUE,
    email VARCHAR(100) UNIQUE
);
SQL

上述示例中,我们创建了一个名为 “users” 的表,其中 “username” 和 “email” 列的值必须是唯一的。如果试图插入一个已经存在的用户名或电子邮件地址,PostgreSQL 将返回一个错误。

范围约束

范围约束用于限制数值列或日期时间列的取值范围。它可以确保列的值在指定的范围内。

以下是一个范围约束的示例:

CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    price NUMERIC CHECK (price > 0 AND price <= 1000)
);
SQL

上述示例中,我们创建了一个名为 “products” 的表,其中 “price” 列的值必须大于 0 且小于等于 1000。如果试图插入一个价格不在指定范围内的产品,PostgreSQL 将返回一个错误。

条件约束

条件约束是一种自定义的检查约束类型,它使用用户定义的条件来限制列的取值。条件约束可以基于列的其他值或多个列的组合。

以下是一个条件约束的示例:

CREATE TABLE orders (
    id SERIAL PRIMARY KEY,
    quantity INTEGER,
    price NUMERIC,
    total NUMERIC CHECK (total = quantity * price)
);
SQL

上述示例中,我们创建了一个名为 “orders” 的表,其中 “total” 列的值必须等于 “quantity” 列乘以 “price” 列的结果。如果试图插入一个 “total” 值与其他列的乘积不一致的订单,PostgreSQL 将返回一个错误。

总结

在本文中,我们介绍了 PostgreSQL 中的检查约束及其作用。我们讨论了违反检查约束时的错误消息以及如何识别违反约束的行。我们还提供了一些示例来说明不同类型的检查约束,包括唯一约束、范围约束和条件约束。通过熟悉和正确使用检查约束,我们可以提高数据库的数据完整性,并减少错误和异常数据的产生。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册