📜  SQL 查询演示表中参照完整性中的删除异常(1)

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

SQL 查询演示表中参照完整性中的删除异常

本文将介绍在SQL关系型数据库中,参照完整性中可能出现的删除异常,并提供相应的查询演示。

参照完整性

在SQL关系型数据库中,参照完整性是一种数据保存机制,通过限制在关系表中的外键值来保证数据完整性。外键值必须参照主键值,这意味着在任意时间,外键 值必须是主键值的一个有效子集。

参照完整性被用于确保数据的一致性,防止多余的、无意义的数据和不一致的数据出现。

当在关系表中删除主键值时,可能出现删除异常。

删除异常

删除异常是指在关系表中由外键关联而形成的主键值在被删除时,可能导致引用该主键值的外键值不再参照主键值,从而导致数据的不一致性。

例如,一个医院管理系统中,一个病患的基本信息保存在patients表中,病患的就诊记录则保存在records表中。records表通过外键将病患与就诊记录联系在一起。

如果在patients表中删除一个病患的记录,可能导致records表中的记录成为孤立的记录,从而导致数据的不一致性。

查询演示

为了演示删除异常,我们将创建两个关系表:customersorderscustomers表包括客户的个人信息,而orders表包括客户的订单信息。客户和订单之间通过外键关联。

以下是创建customers表和orders表的SQL语句:

CREATE TABLE customers(
  customer_id INT PRIMARY KEY,
  customer_name VARCHAR(50),
  customer_address VARCHAR(50)
);

CREATE TABLE orders(
  order_id INT PRIMARY KEY,
  order_date DATE,
  customer_id INT,
  FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

接下来,我们插入一些数据到customersorders表中:

INSERT INTO customers(customer_id, customer_name, customer_address)
VALUES
(1, 'Alice', '123 Main St.'),
(2, 'Bob', '456 Oak Ln.'),
(3, 'Charlie', '789 Maple Ave.');

INSERT INTO orders(order_id, order_date, customer_id)
VALUES
(101, '2021-01-01', 1),
(102, '2021-02-01', 1),
(103, '2021-03-01', 2),
(104, '2021-04-01', 3),
(105, '2021-05-01', 3);

这将创建一个包含客户和订单数据的测试数据集。接下来,我们将尝试删除一个客户记录:

DELETE FROM customers WHERE customer_id = 3;

执行此查询将导致以下错误:

ERROR:  update or delete on table "customers" violates foreign key constraint "orders_customer_id_fkey" on table "orders"
DETAIL:  Key (customer_id)=(3) is still referenced from table "orders".

这是因为在orders表中仍然有一些订单记录关联到被删除的客户。删除客户记录将导致orders表中的外键值不再参照customers中的主键,从而导致删除异常。