📅  最后修改于: 2023-12-03 15:12:20.307000             🧑  作者: Mango
在 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 数据库中处理数据的效率。