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

第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文档。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值