用SQL编写参照表和被参照表的参照完整性触发器,请分别给出三个例子
时间: 2024-02-13 13:02:53 浏览: 65
参照完整性触发器可以确保一个表中的数据在被更新或删除时,不会破坏与另一个表之间的参照关系。以下是三个示例,分别是参照表和被参照表的参照完整性触发器:
**示例1:**
假设有两个表 `orders` 和 `order_items`,其中 `orders` 表的主键是 `order_id`,`order_items` 表中有一个外键 `order_id`,参照 `orders` 表的 `order_id` 字段。在这个情况下,可以使用以下 SQL 语句创建一个参照完整性触发器,确保在删除 `orders` 表中的一行时,对应的 `order_items` 表中的行也被删除:
```SQL
CREATE TRIGGER delete_order_items_trigger
AFTER DELETE ON orders
FOR EACH ROW
BEGIN
DELETE FROM order_items WHERE order_id = OLD.order_id;
END;
```
在这个触发器中,`OLD.order_id` 表示已经被删除的 `orders` 表中的行的 `order_id` 值。
**示例2:**
假设有两个表 `employees` 和 `departments`,其中 `employees` 表中有一个外键 `dept_id`,参照 `departments` 表的 `dept_id` 字段。在这个情况下,可以使用以下 SQL 语句创建一个参照完整性触发器,确保在删除 `departments` 表中的一行时,所有参照该行的 `employees` 表中的行的外键值都被置为 `NULL`:
```SQL
CREATE TRIGGER nullify_dept_id_trigger
AFTER DELETE ON departments
FOR EACH ROW
BEGIN
UPDATE employees SET dept_id = NULL WHERE dept_id = OLD.dept_id;
END;
```
在这个触发器中,`OLD.dept_id` 表示已经被删除的 `departments` 表中的行的 `dept_id` 值。
**示例3:**
假设有两个表 `products` 和 `sales`,其中 `sales` 表中有两个外键 `product_id` 和 `customer_id`,分别参照 `products` 表的 `product_id` 和 `customers` 表的 `customer_id` 字段。在这个情况下,可以使用以下 SQL 语句创建两个参照完整性触发器,确保在删除 `products` 表中的一行或 `customers` 表中的一行时,对应的 `sales` 表中的行也被删除:
```SQL
CREATE TRIGGER delete_sales_by_product_trigger
AFTER DELETE ON products
FOR EACH ROW
BEGIN
DELETE FROM sales WHERE product_id = OLD.product_id;
END;
CREATE TRIGGER delete_sales_by_customer_trigger
AFTER DELETE ON customers
FOR EACH ROW
BEGIN
DELETE FROM sales WHERE customer_id = OLD.customer_id;
END;
```
在这些触发器中,`OLD.product_id` 和 `OLD.customer_id` 分别表示已经被删除的 `products` 表中的行的 `product_id` 值和已经被删除的 `customers` 表中的行的 `customer_id` 值。
阅读全文