SQL必知必会 第二十二课 笔记—— 高级SQL特性(SQL完结章)

xiaoxiao2021-02-28  76

第22课 高级SQL特性 这一课介绍SQL所涉及的几个高级数据处理特性:约束、索引和触发器。 22.1 约束 约束(constraint):管理如何插入或处理数据库数据的规则。 DBMS通过在数据库表上施加约束来实施引用完整性。大多数约束是在表定义中定义的,如第17课所述,用CREATE TABLE或ALTER TABLE语句。 22.1.1 主键 我们在第1课简单提过主键, 主键是一种特殊的约束。一种定义主键的方法是创建它,如下所示 CREATE TABLE Vendors ( vend_id CHAR(10) NOT NULL PRIMARY KEY , vend_name CHAR(50) NOT NULL, vend_address CHAR(50) NULL ); 在此例子中,给表的vend_id列定义添加 关键字PRIMARY KEY,使其成为主键。 ALTER TABLE Vendors ADD CONSTRAINT PRIMARY KEY (vend_id); 这里定义相同的列为主键,但使用的是 CONSTRAINT语法。此语法也可以用于CREATE TABLE和ALTER TABLE语句。 说明:SQLite中的键 SQLite不允许使用ALTER TABLE定义键,要求在初始的CREATE TABLE语句中定义它们。 22.1.2 外键 外键是表中的一列,其值必须列在另一表的主键中。外键是保证引用完整性的极其重要部分。 CREATE TABLE Orders ( order_num INTEGER NOT NULL PRIMARY KEY, order_date DATETIME NOT NULL, cust_id CHAR(10) NOT NULL REFERENCES Customers(cust_id) ); 分析▼ 其中的表定义使用了 REFERENCES关键字,它表示cust_id中的任何值都必须是Customers表的cust_id中的值。 相同的工作也可以在ALTER TABLE语句中用CONSTRAINT语法来完成: ALTER TABLE Orders ADD CONSTRAINT FOREIGN KEY (cust_id) REFERENCES Customers (cust_id) 提示:外键有助防止意外删除 如第6课所述,除帮助保证引用完整性外,外键还有另一个重要作用。在定义外键后,DBMS不允许删除在另一个表中具有关联行的行。 22.1.3 唯一约束 唯一约束用来保证一列(或一组列)中的数据是唯一的。它们类似于主键,但存在以下重要区别。 表可包含多个唯一约束,但每个表只允许一个主键。唯一约束列可包含NULL值。唯一约束列可修改或更新,主键不可以。唯一约束列的值可重复使用,主键不能重用。与主键不一样,唯一约束不能用来定义外键。 唯一约束的语法类似于其他约束的语法。唯一约束既可以用UNIQUE关键字在表定义中定义,也可以用单独的CONSTRAINT。 22.1.4 检查约束 检查约束用来保证一列(或一组列)中的数据满足一组指定的条件。 ALCREATE TABLE OrderItems ( order_num INTEGER NOT NULL, quantity INTEGER NOT NULL CHECK (quantity > 0) , ); 如上,利用这个约束,任何插入(或更新)的行都会被检查,保证quantity大于0. ADD CONSTRAINT CHECK (gender LIKE '[MF]') 如上,检查名为gender的列只包含M或F 22.2 索引 索引用来排序数据以加快搜索和排序操作的速度。想像一本书后的索引(如本书后的索引) 解决方法是使用索引。可以在一个或多个列上定义索引,使DBMS保存其内容的一个排过序的列表。在定义了索引后,DBMS以使用书的索引类似的方法使用它。DBMS搜索排过序的索引,找出匹配的位置,然后检索这些行。 注意: 索引改善检索操作的性能,但降低了数据插入、修改和删除的性能。在执行这些操作时,DBMS必须动态地更新索引。 索引用CREATE INDEX语句创建(不同DBMS创建索引的语句变化很大)。下面的语句在Products表的产品名列上创建一个简单的索引: CREATE INDEX prod_name_ind ON PRODUCTS (prod_name); 分析▼ 索引必须唯一命名。这里的索引名prod_name_ind在关键字 CREATE INDEX之后定义。ON用来指定被索引的表,而索引中包含的列(此例中仅有一列)在表名后的圆括号中给出。 22.3 触发器 触发器是特殊的存储过程,它在特定的数据库活动发生时自动执行。触发器可以与特定表上的INSERT、UPDATE和DELETE操作(或组合)相关联。 根据所使用的DBMS的不同,触发器可在特定操作执行之前或之后执行。 下面的例子创建一个触发器,它对所有INSERT和UPDATE操作,将Customers表中的cust_state列转换为大写。这是本例子的SQL Server版本: CREATE TRIGGER customer_state ON Customers FOR INSERT, UPDATE AS UPDATE Customers SET cust_state = Upper(cust_state) WHERE Customers.cust_id = inserted.cust_id; 提示:约束比触发器更快 一般来说,约束的处理比触发器快,因此在可能的时候,应该尽量使用约束。 22.4 数据库安全 安全性使用SQL的 GRANTREVOKE语句来管理,不过,大多数DBMS提供了交互式的管理实用程序,这些实用程序在内部使用GRANT和REVOKE语句。 22.5 小结 本课讲授如何使用SQL的一些高级特性。约束是实施引用完整性的重要部分,索引可改善数据检索的性能,触发器可以用来执行运行前后的处理,安全选项可用来管理数据访问。不同的DBMS可能会以不同的形式提供这些特性,更详细的信息请参阅具体的DBMS文档。
转载请注明原文地址: https://www.6miu.com/read-2596084.html

最新回复(0)