若R和S分别为具有参照完整性的两张表,其中,R是主表,S是从表,则下面表述正确的有: A、 S中的外码的取值要么引用了R中的码值,要么为空值 B、 R中必须包含S中外码所对应的码 C、 删除R或修改R被S引用的码值可能破坏参照完整性 D、 修改S的外码值或插入新的元组可能破坏参照完整性
时间: 2024-03-04 13:51:55 浏览: 44
若R和S分别为具有参照完整性的两张表,其中,R是主表,S是从表,则下面表述正确的是:
A、S中的外码的取值要么引用了R中的码值,要么为空值。这是参照完整性的基本要求,即从表中的外码值必须要么引用主表中的码值,要么为空值。
B、R中必须包含S中外码所对应的码。这是外键的定义要求,即从表中的外码必须要求引用主表中的主码。
C、删除R或修改R被S引用的码值可能破坏参照完整性。如果主表中被从表引用的码值被删除或修改,就可能破坏从表中的参照完整性。
D、修改S的外码值或插入新的元组可能破坏参照完整性。如果从表中的外码值被修改成未在主表中定义的值,或者插入了未在主表中定义的外码值,就可能破坏参照完整性。
因此,选项A、B、C、D都是正确的。
相关问题
定义S表、P表和SP表上的主码和外码,以保证实体完整性和参照完整性。
S表代表供应商,P表代表零件,SP表代表供应商和零件之间的供应关系。
在S表中,主码可以定义为供应商编号(S#),外码可以定义为供应商所在城市(S_city),以保证实体完整性和参照完整性。这样,每个供应商的编号都是唯一的,而且每个供应商所在的城市必须在城市表中存在。
在P表中,主码可以定义为零件编号(P#),外码可以定义为零件所属的类别(P_type),以保证实体完整性和参照完整性。这样,每个零件的编号都是唯一的,而且每个零件所属的类别必须在零件类别表中存在。
在SP表中,主码可以定义为(S#, P#),外码可以定义为(S#)和(P#),以保证实体完整性和参照完整性。这样,每个供应商和零件的组合都是唯一的,而且每个供应商编号和零件编号必须在相应的表中存在。
用SQL编写参照表和被参照表的参照完整性触发器,请分别给出三个例子
参照完整性触发器可以确保一个表中的数据在被更新或删除时,不会破坏与另一个表之间的参照关系。以下是三个示例,分别是参照表和被参照表的参照完整性触发器:
**示例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` 值。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)