如何在 SQL 中创建外键约束

如何在 SQL 中创建外键约束

如果您拥有一家企业,您可能已经体验到了企业中数据的价值和需求。拥有一种存储和操作数据库的方法可以为您的业务增加更多价值。

数据库根据特定规则进行组织,允许数据连接和结构化,从而产生了关系数据库,它是自 20 世纪 70 年代以来数据管理的一种形式。当今的市场青睐关系数据库,因为它们在处理数据时具有强大的功能。

可用的关系数据库有很多,但根据Statista 的数据, MySQL 拔得头筹,截至 2022 年 1 月,在全球排名第二。

在 SQL Server 中,约束是适用于单个或多个列的预定义规则和限制。它们与列值相关联,有助于维护给定列中数据的完整性、准确性和可靠性。

简单来说,只有满足约束规则的数据才会成功插入到列中。如果数据不满足条件,则终止插入操作。

这篇文章假设您已经接触过关系数据库,特别是 MySQL,并且想加强您在这方面的知识。最后,这里有一些使用外键约束的技巧。

主键约束 – 总结SQL表必须有一个或多个列,其中包含精确标识系统中每一行的键值。表的主键 (PK) 列负责强制表实体的完整性。主键约束保证数据唯一,并且通常在标识列上定义。

当您为表指定主键约束时,数据库引擎会通过在每个主列上生成唯一索引来自动强制数据唯一性。在查询中使用主键非常有利,因为它允许快速访问数据。

当在多个列上定义主键约束时,称为复合主键或复合主键。在这种情况下,每个主键列可能包含重复值。但是,主键中所有列的组合值必须是唯一的。

一个很好的例子是,如果您有一个包含“ id” 、“names”和“ age”列的表。当您在“ id ”和“ names ”的组合上定义主键约束时,可能会出现“ id ”值或“ names ”值的重复实例。但是,每个组合必须是唯一的,以避免重复行。因此,您可以拥有“ id=1 ”和“ name=Walter ”、“ age-22”和“ id=1 ”、“ name=Henry ”和“ age=27 ”的记录,但其他记录不能有。这是因为` id=1`和` name=Walter`的组合不是唯一的。

需要了解的一些重要方面是:

一张表只包含一个主键约束。主键不能超过 16 列,最大长度为 900 个字符。主键生成的索引可以增加表中的索引。但是,一个表上的聚集索引的数量不能超过1个,一个表上的非聚集索引的数量限制为999个。如果键约束未指定聚类或非聚类,则自动选择聚类。主键约束中声明的所有列都必须定义为非空。否则,约束内所有链接列的可为空性将自动设置为非空。如果主键是在公共语言运行时 (CLR)用户定义的列类型上定义的,则类型实现必须支持二进制排序。外键约束 – 概述外键(FK)包含一个列或多个列的组合,用于创建链接并绑定两个表,并管理存储在外键表中的数据。

外键引用需要在两个表之间创建链接。保存另一个表的主键的列被另一个表的列引用。

在外键引用场景中,当一个表中保存主键的列被另一个表中的列引用时,两个表之间就会创建连接。

在实际用例中,您可以创建一个表Sales.SalesOrderHeader ,其外键链接到另一个表Sales. Person 。因为销售人员和销售订单之间存在逻辑关系。

此处, SalesOrderHeader中的SalesPersonID列与SalesPerson表的主键列混合。 SalesPerson table外键是SalesOrderHeader中的SalesPersonID列。

这种关系定义了规则。换句话说,如果SalesPersonID值在SalesOrderHeader表中不存在,则它不能包含在SalesPerson表中。

一个表最多可以引用 253 个其他列和表作为外键(也称为出站引用)。从 2016 年开始,SQL Server 将单个表中可引用的表和列的数量(也称为入站引用)从 253 个增加到 10000 个。然而,这种增加有一些局限性。

大于 253 的外键引用只能在 DELETE DML 操作中使用。不支持合并和更新。具有对其自身的外键引用的表最多可以有 253 个外键引用。对于列存储索引、内存优化表和分区外键表,外键引用限制为 253 个。外键有什么好处?前面提到,外键约束在保护关系数据库的完整性和数据一致性方面发挥着重要作用。这里我们将详细解释为什么外键约束是必要的。

参照完整性——外键约束确保所有子表记录都与主表记录相对应,从而确保两个表之间的数据一致性。防止孤立记录– 当您删除父表时,外键约束可确保相关子表也被删除,从而防止出现可能导致数据不一致的孤立记录实例。提高性能——外键约束允许数据库管理系统根据表关系优化查询,从而提高查询性能。外键约束索引外键约束不会像主键一样自动创建相应的索引。您可以手动为外键约束创建索引。由于以下原因,它是有益的:

外键列通常用在连接条件中,通过匹配与约束关联的列来连接查询中相关表中的数据。索引帮助数据库查找外部表中的相关数据。当您修改主键约束时,它将与相关表中的外部约束进行匹配。不需要创建索引。您可以连接两个表中的数据,而无需指定主键和外键约束。但是,添加外键约束可以优化表并将表连接到满足键使用条件的查询。当您修改主键约束时,系统会根据关联的外来约束对其进行检查。

在 SQL 中创建外键约束的技巧您已经在这个猜测上花费了相当多的时间。我回答了原因。让我们转移注意力并将其范围缩小到创建外键约束的策略。请回答如何。

表中的“外键”字段引用另一个字段的“主键”。具有主键的表是父表。具有外键的表称为子表。让我们深入了解一下。

如何在 SQL 中创建外键约束创建表时创建外键创建表时,还可以创建外键约束以保持引用完整性。方法如下:

CREATE TABLE orders (

order_id INT PRIMARY KEY,

customer_id INT,

order_date DATE,

FOREIGN KEY (customer_id) REFERENCES customers(customer_id)

);上面的代码创建了一个名为“orders”的表,其中包含主整数键“order_id”、另一个整数“customer_id”和日期“order_date”。在本例中,FOREIGN KEY 约束添加到“customer_id”列,引用“customers”表中的“customer_id”。

如何在 SQL 中创建外键约束创建表后创建外键假设您已经创建了一个表并想要添加外键约束。在代码中使用“ ALTER TABLE ”语句。请参阅下面的代码片段。

ALTER TABLE orders

ADD FOREIGN KEY (customer_id) REFERENCES customers(customer_id);在本例中,我向“orders”表添加了外键约束“customer_id”列,以引用“customers”表的“customer_id”列。

如何在 SQL 中创建外键约束创建外键而不检查现有数据当您向表添加外键约束时,数据库会自动检查现有数据以确保与约束的一致性。但是,如果您知道数据是一致的,并且想要添加约束而不进行一致性检查,则可以通过以下方式进行:

ALTER TABLE orders

ADD CONSTRAINT fk_orders_customers

FOREIGN KEY (customer_id)

REFERENCES customers(customer_id)

NOT VALIDATE; NOT VALIDATE命令告诉数据库不要检查现有数据。这种特殊情况在某些情况下很有用。例如,如果您有大量数据并想要完成验证过程。

如何在 SQL 中创建外键约束 使用 DELETE/UPDATE 创建外键您可以创建外键约束来指示更新或删除引用的行时要采取的操作。在这种情况下,请使用级联引用完整性约束来指定要采取的操作。它们包括:

#1.什么也不做与许多其他数据库一样,“NO ACTION”规则是创建外键约束时的默认行为。这意味着如果引用的行被删除或更新,则不会执行任何操作。

如果违反外键约束,数据库引擎会生成错误。但是,不建议这样做,因为它需要强制执行外键约束,这可能会导致引用完整性问题。下面是如何执行此操作的示例。

ALTER TABLE orders

ADD CONSTRAINT fk_orders_customers

FOREIGN KEY (customer_id)

REFERENCES customers(customer_id)

ON DELETE NO ACTION

ON UPDATE NO ACTION; #2.级联“CASCADE”规则是创建外键约束时“ON DELETE”和“ON UPDATE”操作的另一个选项。有了这个,每当父表中更新或删除一行时,引用的行也将相应地更新或删除。该技术在维护引用完整性方面非常强大。例如:

ALTER TABLE orders

ADD CONSTRAINT fk_orders_customers

FOREIGN KEY (customer_id)

REFERENCES customers(customer_id)

ON DELETE CASCADE

ON UPDATE CASCADE;应谨慎使用此规则,因为如果不小心使用,可能会导致不良结果。您不想意外删除大量数据或创建循环引用。因此,请谨慎使用此选项,并且仅在必要时使用。

使用 CASCADE 有一些规则。

如果时间戳列是外键或引用键的一部分,则无法指定 CASCADE。如果表具有 INSTEAD OF DELETE 触发器,则无法指定 ON DELETED CASCADE。如果表具有 INSTEAD OF UPDATE 触发器,则无法指定 ON UPDATE CASCADE。 #3。设置为空删除或更新父表中的相应行会将构成外键的所有值设置为空。此约束规则要求外键列在运行时可为空,并且不能为具有 INSTEAD OF UPDATE 触发器的表指定。下面是如何执行此操作的示例。

ALTER TABLE orders

ADD CONSTRAINT fk_orders_customers

FOREIGN KEY (customer_id)

REFERENCES customers(customer_id)

ON DELETE SET NULL

ON UPDATE SET NULL在本例中,如果“customers”表中的相应行被删除或更新,我们将“orders”表中的外键列“customer_id”设置为 null。

#4。设置默认值这里我们设置了如果父表中引用的行被更新或删除,将导致外键默认的所有值。

当所有外键列都有默认定义时,会强制执行此约束。如果列可为空,则其默认值设置为 NULL。请注意,不能为具有 INSTEAD OF UPDATE 触发器的表指定此选项。例如:

ALTER TABLE orders

ADD CONSTRAINT fk_orders_customers

FOREIGN KEY (customer_id)

REFERENCES customers(customer_id)

ON DELETE SET DEFAULT

ON UPDATE SET DEFAULT;在上面的示例中,“orders”表中的“customer_id”被设置为默认值。当“customers”表中的相应行被删除或更新时,就会发生这种情况。

最后一句话在本指南中,我们回顾了主键约束并详细讨论了外键约束。我还遇到了几种创建外键约束的技术。创建外键约束的方法有很多,在这篇文章中我们已经弄清楚了如何做到这一点。

我希望你学到了一项新技术。您不限于将它们组合起来。例如,可以在引用表上组合 CASCADE、SET NULL、SET DEFAULT 和 NO ACTION 约束方法。

如果表上发生 NO ACTION,则表将恢复为其他约束规则。在其他情况下,DELETE 操作可能会触发这些规则的组合,最后执行 NO ACTION 规则。

接下来,查看我们的 SQL 备忘单。

相关内容

老年机通话音量怎么调?这几个步骤很实用!
365体育ribo88

老年机通话音量怎么调?这几个步骤很实用!

🕒 06-30 👁️ 2369
《天堂之心》评测 超自由跨服竞技
365betapp

《天堂之心》评测 超自由跨服竞技

🕒 06-30 👁️ 8015
世界油画大师排名
365betapp

世界油画大师排名

🕒 07-22 👁️ 733