📜  违反检查约束 - SQL (1)

📅  最后修改于: 2023-12-03 15:12:20.307000             🧑  作者: Mango

违反检查约束 - SQL

在 SQL 数据库中,检查约束是一种用于限制列值的条件。 它们用于确保列中的数据满足预定义的规则。 检查约束可以在创建表时定义,也可以在ALTER TABLE语句中添加。

当违反检查约束时,数据库将拒绝插入或更新数据。这可以确保数据在插入或更新后保持完整和准确。但有时候,由于某些原因,检查约束被违反。

检查约束的类型

以下是三种 SQL 支持的检查约束类型:

唯一性约束

唯一性约束用于确保列中的每个值都是唯一的。 如果在列中已经存在该值,则违反了此约束。

CREATE TABLE students (
  student_id INT PRIMARY KEY,
  student_name VARCHAR(255) NOT NULL,
  email VARCHAR(255) NOT NULL UNIQUE,
  class_id INT NOT NULL,
  CONSTRAINT FK_class
    FOREIGN KEY (class_id) REFERENCES classes(class_id)
);

INSERT INTO students (student_id, student_name, email, class_id) VALUES (1, 'John Doe', 'jdoe@example.com', 1);
INSERT INTO students (student_id, student_name, email, class_id) VALUES (2, 'Jane Doe', 'jdoe@example.com', 2);

执行上述 SQL 语句,将会返回以下错误信息:

ERROR:  duplicate key value violates unique constraint "students_email_key"
DETAIL:  Key (email)=(jdoe@example.com) already exists.
外键约束

外键约束可以确保表中的列只包含另一个表的键值。 请注意,应该先创建被引用的表,然后才能创建包含外键的表。

CREATE TABLE classes (
  class_id INT PRIMARY KEY,
  class_name VARCHAR(255) NOT NULL,
  teacher_id INT NOT NULL
);

CREATE TABLE students (
  student_id INT PRIMARY KEY,
  student_name VARCHAR(255) NOT NULL,
  email VARCHAR(255) NOT NULL UNIQUE,
  class_id INT NOT NULL,
  CONSTRAINT FK_class
    FOREIGN KEY (class_id) REFERENCES classes(class_id)
);

INSERT INTO students (student_id, student_name, email, class_id) VALUES (1, 'John Doe', 'jdoe@example.com', 3);

执行上述 SQL 语句,将会返回以下错误信息:

ERROR:  insert or update on table "students" violates foreign key constraint "fk_class"
DETAIL:  Key (class_id)=(3) is not present in table "classes".
检查约束

检查约束用于确保列值满足某些条件。 下面的 SQL 代码使用检查约束确保 age 列不小于 20 并且不大于 60。

CREATE TABLE users (
  user_id INT PRIMARY KEY,
  user_name VARCHAR(255) NOT NULL,
  age INT CONSTRAINT chk_age CHECK (age >= 20 AND age <= 60)
);

INSERT INTO users (user_id, user_name, age) VALUES (1, 'John Doe', 18);

执行上述 SQL 语句,将会返回以下错误信息:

ERROR:  new row for relation "users" violates check constraint "chk_age"
DETAIL:  Failing row contains (1, John Doe, 18).
总结

在 SQL 数据库中,检查约束是一种用于限制列值的条件。 当违反检查约束时,数据库将拒绝插入或更新数据。这可以确保数据在插入或更新后保持完整和准确。 了解检查约束的类型以及如何创建它们可以大大提高开发人员在 SQL 数据库中处理数据的效率。