2024年9月sql的约束(sql语句0~100约束)

 更新时间:2024-09-21 09:31:05

  ⑴sql的约束(sql语句~约束)

  ⑵本文主要介绍sql的约束(sql语句~个约束),下面一起看看sql的约束(sql语句~个约束)相关资讯。

  ⑶目录、约束.主键.外键.唯一约束.检查约束、索引、触发器、数据库安全、总结本文介绍了SQL涉及的几个数据处理特性:约束、索引和触发器。约束是实现引用完整性的重要部分,索引可以提高数据检索的性能,触发器可以用于执行运行前后的处理。

  ⑷ConstrainedSQL在许多版本中得到了改进,已经成为一种非常完美和强大的语言。许多强大的功能为用户提供了高级的数据处理技术,例如约束。

  ⑸关联表和参照完整性以前已经讨论过几次了。如前所述,关系数据库存储分解到多个表中的数据,每个表存储相应的数据。使用键建立从一个表到另一个表的引用[因此有了术语引用完整性]。

  ⑹为了正确地设计关系数据库,我们需要一种方法来确保只有合法的数据入到表中。

  ⑺例如,如果Orders表存储订单信息,而OrderItems表存储订单详细信息,则应该确保OrderItems中引用的任何订单ID都存在于订单中。

  ⑻同样,Orders表中引用的任何客户都必须存在于Customers表中。

  ⑼虽然您可以在插入新行时进行检查(在另一个表上执行SELECT以确保所有值都合法并且存在),但出于以下原因,最好不要这样做。

  ⑽如果数据库完整性规则在客户端级别实现,每个客户端都将实现这些规则,而有些客户端肯定不会实现这些规则。在执行更新和删除操作时,也必须实现这些规则。执行客户端检查非常耗时,DBMS可以相对高效地执行这些检查。约束(约束)

  ⑾控制如何插入或处理数据库数据的规则。

  ⑿DBMS通过对数据库表施加约束来加强参照完整性。

  ⒀大多数约束是在表定义中定义的,如如何使用SQLCREATETABLE、使用CREATETABLE或ALTERTABLE语句创建新表中所述。

  ⒁注意:特定数据库管理系统的约束

  ⒂有几种不同类型的约束,每个DBMS都提供自己的支持。

  ⒃因此,这里给出的例子在不同的DBMS上可能会有不同的反应。在进行实验之前,请参考特定的DBMS文档。

  ⒄主键我们在学习SQL之前需要知道的基础知识已经简单提到了。

  ⒅主键是一种特殊的约束,用于确保一列(或一组列)中的值是唯一的,并且永远不会改变。

  ⒆换句话说,表中有一个一列(或多列)的值唯一标识表中的每一行。这有助于直接或交互处理表中的行。

  ⒇如果没有主键,很难在不影响其他行的情况下安全地更新或删除特定的行。

  ⒈只要满足下列条件,表中的任何列都可以用作主键。

  ⒉任何两行的主键值都是不同的。每行都有一个主键值(即列中不允许有空值)。包含主键值的列永远不会被修改或更新。(大多数数据库管理系统不不允许这样做,但是如果你正在使用的数据库管理系统允许,那么,不要t!)主键值不能重复使用。如果从表中删除一行,它的主键值不会分配给新行。定义主键的一种方法是创建主键,如下所示。

  ⒊创建表供应商(vend_idCHAR()NOTNULL主键,vend_nameCHAR()NOTNULL,vend_addressCHAR()NULL,vend_cityCHAR()NULL,vend_stateCHAR()NULL,vend_zipCHAR()NULL,vend_countryCHAR()NULL);在本例中,关键字PRIMARYKEY被添加到表的vend_id列定义中,使其成为主键。

  ⒋ALTERTABLEVendorsADD约束主键(vend_id);这里将同一列定义为主键,但是使用了约束语法。该语法也可用于CREATETABLE和ALTERTABLE语句。

  ⒌描述:SQLite中的密钥

  ⒍SQLite不允许使用ALTERTABLE来定义键,并要求在初始CREATETABLE语句中定义键。

  ⒎外键外键是表中的一列,其值必须列在另一个表的主键中。外键是确保引用完整性的一个极其重要的部分。让让我们举个例子来理解外键。

  ⒏Orders表包含作为一行输入到系统中的每个订单。

  ⒐客户信息存储在Customers表中。Orders表中的订单通过客户ID与Customers表中的特定行相关联。

  ⒑客户ID是Customers表的主键,每个客户都有一个唯一的ID。订单编号是订单表的主键,每个订单都有一个唯一的订单编号。

  ⒒Orders表中客户ID列的值不一定是唯一的。

  ⒓如果客户有多个订单,则有多个行具有相同的客户ID(尽管每个订单有不同的订单号)。同时,Orders表中客户ID列的合法值就是Customers表中的客户ID。

  ⒔这就是外键的作用。在本例中,外键是在订单的客户ID列上定义的,因此该列只能接受客户表的主键值。

  ⒕这里如何定义这个外键。

  ⒖创建订单表(order_numINTEGERNOTNULL主键,order_dateDATETIMENOTNULL,cust_idCHAR()NOTNULL引用客户(cust_id));表定义使用REFERENCES关键字,这意味着cust_id中的任何值都必须是Customers表的cust_id中的值。

  ⒗在ALTERTABLE语句中使用约束语法也可以完成同样的工作:

  ⒘ALTERTABLEordersaddconstraintforeignKEY(cust_id)引用Customers(cust_id);提示:外键有助于防止意外删除。

  ⒙如如何使用SQLUPDATE和DELETE语句更新或删除表数据中所述,外键除了有助于确保引用完整性之外,还有另一个重要功能。

  ⒚定义外键后,DBMS不允许删除与另一个表中的行相关联的行。

  ⒛例如,不能删除与订单关联的客户。删除客户的唯一方法是首先删除相关订单(这意味着删除相关订单项目)。因为需要一系列的删除,所以使用外键可以防止数据的意外删除。

  有些数据库管理系统支持一种称为级联删除的功能。如果启用,此功能将在从表中删除行时删除所有相关数据。

  例如,如果启用了级联删除,并且从客户表中删除了一个客户,则任何关联的订单行也会被自动删除。

  唯一约束唯一约束用于确保一列(或一组列)中的数据是唯一的。它们类似于主键,但有以下重要区别。

  表可以包含多个唯一约束,但每个表只允许有一个主键。唯一约束列可以包含空值。可以修改或更新唯一约束列。唯一约束列的值可以重复使用。与主键不同,唯一约束不能用于定义外键。employees表是使用约束的一个例子。每个雇员都有一个独特的社会安全号码,但我们没有。;我不想用它作为主键,因为它太长了(我们也不想用它我不想写这封信。兴趣好用)。

  因此,每个雇员除了他的社会保险号之外,还有一个唯一的雇员ID(主键)。

  员工ID是主键,可以确定它是唯一的。您可能还希望DBMS确保每个社会保险号是唯一的(以确保输入错误不会导致他人使用s数字)。您可以通过在社会保险号列上定义唯一约束来实现这一点。

  唯一约束的语法类似于其他约束的语法。可以使用unique关键字或单独的约束在表定义中定义UNIQUE约束。

  检查约束检查约束用于确保一列(或一组列)中的数据满足一组指定的条件。检查约束的常见用法如下。

  检查最小值或最大值。例如,禁止订购个项目(即使是合法数字)。指定范围。例如,交货日期保证大于或等于今天的日期,但不迟于一年后的今天。仅允许某些值。例如,在性别字段中只允许m或f。换句话说,学习SQL之前需要知道的基础知识介绍了数据类型,这些数据类型限制了一个列中可以保存的数据类型。

  Check约束对数据类型施加了进一步的限制,这对于确保插入到数据库中的数据正是您想要的非常重要。

  不需要依赖客户端应用程序或用户来确保正确获取数据,DBMS本身会拒绝任何无效数据。

  以下示例对OrderItems表施加了check约束,以确保所有项目的数量都大于。

  创建表OrderItems(order_numINTEGERNOTNULL,order_itemINTEGERNOTNULL,prod_idCHAR()NOTNULL,quantityINTEGERNOTNULLCHECK(数量),item_priceMONEYNOTNULL);使用此约束,将检查任何插入(或更新)的行,以确保数量大于。

  检查名为gender的列是否只包含m或f,您可以编写以下ALTERTABLE语句:

  添加约束检查(性别相似[MF];);提示:用户定义的数据类型

  一些数据库管理系统允许用户定义他们自己的数据类型。

  它们是定义检查约束(或其他约束)的基本简单数据类型。

  例如,您可以定义自己的名为gender的数据类型,这是一种单字符文本数据类型,带有一个check约束,将其值限制为m或f(未知值可能允许NULL)。

  然后,你可以把该数据类型用于表定义。自定义数据类型的优点在于,您只需应用一次约束(在数据类型定义中),每当使用该数据类型时,这些约束就会自动应用。

  请查阅相应的DBMS文档,看看它是否支持自定义数据类型。

  第二,索引索引用于对数据进行排序,以加快搜索和排序操作。想象一下一本书后面的索引,可以帮助你理解数据库的索引。

  如果你想找出所有的单词"数据类型"在书中,简单的方法是从第一页开始,浏览每一行。虽然这样可以完成任务,但显然不是好办法。

  浏览几页也许可以,但这样浏览整本书不可行。随着要搜索的页面数量的增加,查找所需单词的时间也会增加。

  这就是为什么书应该被索引。索引按字母顺序列出单词及其在书中的位置。搜索单词"数据类型",您可以在索引中找到该单词,并确定它出现在哪些页面中。然后翻到这几页,找到单词"数据类型"。

  索引的作用是什么?It这很简单。;这是正确的种类。找出书中单词的难度不在于必须进行多少次搜索,而在于书中的内容没有按单词排序。如果一本书的内容像字典一样排序,索引是不必要的(所以字典没有索引)。

  数据库索引也是如此。主键数据总是排序的,这是DBMS的工作。因此,通过主键检索特定行始终是一种快速有效的操作。

  但是,搜索其他列中的值通常效率很低。

  例如,如果您想搜索居住在某个州的客户,该怎么办?因为表数据不是按州排序的,所以DBMS必须读取表中的所有行(从第一行开始)以查看它们是否匹配。It这就像在没有索引的书里找单词一样。

  解决方法是使用索引。您可以在一列或多列上定义一个索引,这样DBMS就可以保存其内容的有序列表。

  定义索引后,DBMS以类似于书籍索引的使用它。DBMS搜索排序的索引,找到匹配的位置,然后检索这些行。

  在开始创建索引之前,您应该记住以下几点。

  索引提高了检索操作的性能,但是降低了数据插入、修改和删除的性能。当执行这些操作时,DBMS必须动态更新索引。索引数据可能会占用大量存储空间。并非所有数据都适合索引。值很少的数据(如state)从索引中获得的好处不如具有更多可能值的数据(如surname或firstname)多。索引用于数据过滤和数据排序。如果您经常按照一定的顺序对数据进行排序,它可能适合于索引。您可以在一个索引中定义多个列(例如,州和城市)。这种索引只在按州和城市排序时有用。如果你想按城市排序,这个索引就没用了。对于应该索引什么以及何时索引没有严格的规则。大多数数据库管理系统提供可用于确定索引效率的实用程序,应该经常使用。

  索引是用CREATEINDEX语句创建的(创建索引的语句因DBMS而异)。以下语句在Products表的product列上创建一个简单索引。

  在产品(产品名称)上创建索引产品名称;索引必须唯一命名。这里的索引名prod_name_ind是在关键字CREATEINDEX之后定义的。ON用于指定要索引的表,索引中包含的列(本例中只有一列)在表名后面的括号中给出。

  索引的效率随着表数据的增加或变化而变化。许多数据库管理员发现,过去创建的理想索引经过几个月的数据处理后可能并不理想。

  最好定期检查指数,并根据需要进行调整。

  第三,触发器trigger是一个特殊的存储过程,当特定的数据库活动发生时,它会自动执行。触发器可以与特定表上的插入、更新和删除操作(或组合)相关联。

  与只存储SQL语句的存储过程不同,触发器与单个表相关联。

  只有在Orders表中插入一行时,才会执行与Orders表上的INSERT操作相关联的触发器。

  类似地,只有当Customers表上的INSERT和UPDATE操作出现在表上时,才会执行这些操作的触发器。

  触发器内的代码可以访问以下数据:

  插入操作中的所有新数据;更新操作中的所有新旧数据;删除操作中删除的数据。根据使用的DBMS,触发器可以在执行特定操作之前或之后执行。

  以下是触发器的一些常见用法。

  确保数据一致性。例如,在插入或更新操作中,将所有状态名转换为大写。基于一个表中的更改在其他表上执行活动。例如,每次更新或删除一行时,将审计跟踪记录写入日志表。根据需要执行附加验证并回滚数据。例如,确保客户的可用资金不超过限制,如果超过限制,则阻止插入。计算计算列的值或更新时间戳。读者可能已经注意到,不同DBMS的触发器创建语法有很大不同。有关更多详细信息,请参考相应的文档。

  以下示例创建一个触发器,该触发器将Customers表中的cust_state列转换为大写,以用于所有插入和更新操作。

  这是此示例的SQLServer版本。

  一个函数e触发器customer_stateoncustomersforINSERT,updateasupdatecustomerssetcust_state=Upper(cust_state)其中customers.cust_id=inserted.cust_id;这是此示例的Oracle和PostgreSQL版本:

  CREATETRIGGERcustomer_stateafterINSERT或UPDATEFOR每行beginupdatecustomerssetcust_state=Upper(cust_state)其中customers.cust_id=:old.cust_idEND;提示:约束比触发器更快。

  一般来说,约束的处理速度比触发器快,所以应该尽可能地使用约束。

  数据库安全性对于一个组织来说,没有什么比数据更重要了,因此应该保护这些数据不被或随意浏览。

  当然,需要访问数据的用户也必须能够访问数据,因此大多数DBMS都为管理员提供了管理机制来授权或限制对数据的访问。

  任何安全系统的基础都是用户授权和身份确认。这是一个用户被确认,保证是授权用户,并被允许执行他想要执行的操作的过程。

  有些DBMS使用操作系统的安全措施,有些维护自己的用户和密码列表,有些使用外部目录服务服务器。

  一般来说,需要保护的操作有:

  访问数据库管理功能(创建表格、更改或删除现有表格等)。);对特定数据库或表的访问;访问类型(只读、对特定列的访问等。);只能通过视图或存储过程访问表;创建多级安全措施,允许基于多重登录的访问和控制;限制管理用户帐户的能力。通过使用SQL的GRANT和REVOKE语句来管理安全性,但是,大多数DBMS提供了在内部使用GRANT和REVOKE语句的交互式管理实用程序。

  动词(verb的缩写摘要本文介绍了如何使用SQL的一些高级功能。约束是实现引用完整性的重要部分,索引可以提高数据检索的性能,触发器可用于执行运行前和运行后处理,安全选项可用于管理数据访问。

  不同的DBMS可以以不同的形式提供这些功能。有关更多详细信息,请参考特定的DBMS文档。

您可能感兴趣的文章:

相关文章