为什么建立外键约束所参照的主表的列,必须建立陈主键
时间: 2024-05-31 10:10:16 浏览: 54
建立外键约束所参照的主表的列必须建立唯一性约束,而主键是一种唯一性约束,因此必须建立主键。外键约束的目的是确保数据的一致性和完整性,通过外键约束,可以保证在从表中的外键列只能保存在主表中存在的值,从而避免了从表数据与主表数据不一致的情况。如果参照的主表没有主键,那么就不能建立唯一性约束,也就无法建立外键约束,这就有可能导致数据不一致的情况。
相关问题
外键如何与主表主键建立约束
外键与主表主键建立约束的方式通常有两种:参照完整性约束和触发器约束。
1. 参照完整性约束
参照完整性约束是指,在建立外键时,数据库管理系统会自动检查外键值是否存在于主表主键中,如果不存在,就会拒绝插入或更新相关数据。这种约束方式通常是数据库管理系统默认的行为,也是最常用的方式。
例如,当你在从表上定义外键时,可以使用类似以下的 SQL 语句:
```
CREATE TABLE Orders
(
OrderID int PRIMARY KEY,
CustomerID int NOT NULL,
OrderDate date
);
CREATE TABLE OrderDetails
(
OrderDetailID int PRIMARY KEY,
OrderID int NOT NULL,
ProductID int NOT NULL,
Quantity int,
FOREIGN KEY (OrderID) REFERENCES Orders(OrderID)
);
```
在这个例子中,`OrderDetails` 表中的 `OrderID` 列是一个外键,它参照了 `Orders` 表中的 `OrderID` 列。这条 SQL 语句中使用了 `FOREIGN KEY` 关键字来定义外键,并使用 `REFERENCES` 关键字来指定外键参照的主表和主键列。
2. 触发器约束
触发器约束是指,在插入或更新数据时,数据库管理系统会自动触发一个触发器,并在触发器中检查外键值是否存在于主表主键中,如果不存在,就会拒绝插入或更新相关数据。这种约束方式通常比参照完整性约束更灵活,但是也更加复杂和耗费资源。
例如,你可以使用以下 SQL 语句定义一个触发器:
```
CREATE TRIGGER trg_OrderDetails
ON OrderDetails
INSTEAD OF INSERT
AS
BEGIN
IF NOT EXISTS (SELECT * FROM Orders WHERE OrderID IN (SELECT OrderID FROM inserted))
BEGIN
RAISERROR('Invalid OrderID', 16, 1);
ROLLBACK TRANSACTION;
RETURN;
END
INSERT INTO OrderDetails (OrderDetailID, OrderID, ProductID, Quantity)
SELECT OrderDetailID, OrderID, ProductID, Quantity
FROM inserted;
END;
```
在这个例子中,触发器检查插入操作所涉及到的 `OrderID` 是否存在于 `Orders` 表中,如果不存在,就会拒绝插入操作并抛出一个错误。如果 `OrderID` 存在于 `Orders` 表中,触发器会执行插入操作。
1. 请说明唯一约束和主键约束之间的联系和区别。 2. 在course表中插入一条学分值小于0的记录,该记录能插入成功吗? 3. 建立外键约束所参照的父表的列必须建立成主键吗? 4. 可以建立几种类型的触发器?
1. 主键约束和唯一约束都可以用来保证表中某个字段的唯一性。主键约束要求该字段不允许为空,并且在表中唯一存在,而唯一约束则只要求该字段在表中唯一存在,但可以为空。主键约束可以作为表的主键,用来建立与其他表的关联,而唯一约束则不能作为主键。
2. 不可以插入学分值小于0的记录,因为在定义表时,学分值列的数据类型应该是小数型或整数型,在数据类型的定义中应该已经规定了该列的取值范围,如果插入的值不符合规定,就会插入失败。
3. 不必须建立成主键,父表的被参照列必须是唯一的,可以是主键列,也可以是唯一约束列。
4. 触发器可以分为三种类型:BEFORE触发器、AFTER触发器、INSTEAD OF触发器。其中BEFORE和AFTER触发器可以在INSERT、UPDATE、DELETE等事件发生前或者后触发相关的操作,而INSTEAD OF触发器则可以替代原本的INSERT、UPDATE、DELETE操作,执行自定义操作。在MySQL中,触发器可以使用SQL语句或存储过程实现。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.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)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)