1.约束

为正确地进行关系数据库设计,需要一种方法来保证只在表中插入合法的数据。例如,如果Orders表存储订单信息,OrderItems表存储订单详细内容,应该保证Orderitems中引用的任何订单ID存在于Orders中。类似地,在Orders表中引用的任意用户必须存在于Customers表中。

最好不要在插入新行时进行检查,原因如下:

  • 如果在客户机层面上实施数据库完整性规则,则每个客户机都被迫要实施这些规则,但很可能会有一些客户机不实施这些规则。
  • 在执行UPDATE和DELETE操作时,也必须实施这些规则。
  • 执行客户机端检查是非常耗时的,而DBMS执行这些检查会相对高效。

约束(constraint):管理如何插入或处理数据库数据的规则。

DBMS通过在数据库表上施加约束来实施引用完整性。大多数约束是在表定义中定义的。

(1)主键

主键是一种特殊的约束,它用来保证一个列(或一组列)中的值是唯一的,并且永不改动。换句话说,表中的一个列(或多个列)的值唯一标识表中的行。

表中任意列只要满足以下条件,都可以用于主键:

  • 任意两行的主键值都不相同。
  • 每行都具有一个主键值(即列中不允许NULL值)。
  • 包含主键值的列不修改或更新。
  • 主键值不能重用。如果从表中删除某一行,其主键值不分配给新行。

定义主键的一种方法是创建它,输入:

CREATE TABLE Vendors

( vend_id CHAR(10) NOT NULL PRIMARY KEY,

vend_name CHAR(50) NOT NULL,

vend_address CHAR(50) NULL,

vend_city CHAR(50) NULL,

vend_state CHAR(5) NULL,

vend_zip CHAR(10) NULL,

vend_country CHAR(50) NULL

);

给vend_id列定义添加关键字PRIMARY KEY,使其成为主键。

输入:

ALTER TABLE Vendors

ADD CONSTRAINT PRIMARY KEY(vend_id);

这里使用CONSTRAINT语法将vend_id列设为主键。

(2)外键

外键是表中的一个列,其值必须在另一个表的主键中列出。外键是保证引用完整性的一个极重要的成分。

例如:

Orders表对每个录入到系统的订单包含一行。

顾客信息存储在Customers表中。

Orders表中的订单通过客户ID与Customers表中特定行相关联。

客户ID为Customers表的主键;每个客户都有唯一的ID。

订单号为Orders表的主键;每个订单都有唯一的订单号。

Orders表中顾客ID列的值不一定是唯一的,若某个顾客有多个定damn,则有多个行具有相同的顾客ID。

同时,Orders表中顾客ID列的合法值为Customers表中顾客的ID。

上例中,在Orders的顾客ID列上定义了一个外键,因此该列只能接受Customers表的主键值。

定义外键的的一种方法,输入:

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)

);

也可以在ALTER TABLE语句中使用CONSTRAINT语法来完成,输入:

ALTER TABLE Customers

ADD CONSTRAINT

FOREIGN KEY (cust_id) REFERENCES Customers (cust_id);

外键有助防止意外删除:

帮助保证引用完整性外;

‚在定义外键后,DBMS不允许删除在另一个表中具有关联行的行。

(3)唯一约束

唯一约束用来保证一个列中的数据唯一。

类似于主键,但存在几个重要区别:

  • 表可包含多个唯一约束,但每个表只允许一个主键。
  • 唯一约束列可包含NULL值。
  • 唯一约束列可修改或更新。
  • 唯一约束列的值可重复使用。
  • 与主键不一样,唯一约束不能用来定义外键。

唯一约束的语法类似于其他约束的语法。唯一约束既可以用UNIQUE关键字在表定义中定义,也可以用单独的CONSTRAINT定义。

(4)检查约束

检查约束用来保证一个列中的数据满足一组指定的条件。

常见用途:

检查最小或最大值。

‚指定范围。

ƒ只允许特定的值。

下面对OrderItems表施加了检查约束,保证所有物品数量大于0。

输入:

CREATE TABLE OrderItems

( order_num INTEGER NOT NULL,

order_item INTEGER NOT NULL,

prod_id CHAR(10) NOT NULL,

quantity INTEGER NOT NULL CHECK(quantity > 0),

item_price MONEY NOT NULL

);

检查名为gender的列只包含M或F,使用ALTET TABLE语句,输入:

ADD CONSTRAINT CHECK (gender LIKE '[MF]');

2.索引

索引用来排序数据以加快搜索和排序操作的速度。

可以在一个或多个列上定义索引,使DBMS保存其内容的一个排过序的列表。定义索引后,DBMS搜索排过序的索引,找出匹配的位置,然后检索这些行。

在开始创建索引前,应该记住以上内容:

(1)索引改善检索操作的性能,但降低数据插入、修改和删除的性能。在执行这些操作时,DBMS必须动态地更新索引。

(2)索引数据可能要占用大量的存储空间。

(3)并非所有数据都适合于索引。

(4)索引用于数据过滤和数据排序。

(5)可以在索引中定义多个列。

索引用CREATE INDEX语句创建。

下面在Products表的产品名列上创建一个简单索引,输入:

CREATE INDEX prod_name_ind

ON PRODUCTS(prod_name);

索引必须唯一命名。这里的索引名在关键字CREATE INDEX之后定义。ON用来指定被索引的表,而索引中包含的列在表名后的圆括号中给出。

检查索引:索引的效率随表数据的增加或改变而变化。

3.触发器

触发器是特殊的存储过程,它在特定的数据库活动发生时自动执行。触发器可以与特定表上的INSERT、UPDATE和DELETE操作相关联。

与存储过程不一样,触发器与单个的表相关联。与Orders表上的INSERT操作相关联的触发器只在Orders表中插入行时执行。类似地,Customers表上的INSERT和UPDATE操作的触发器只在表上出现这些操作时执行。

触发器内的代码具有以下数据的访问权:

  • INSERT操所中的所有新数据;
  • UPDATE操作中的所有新数据和旧数据;
  • DELETE操作中删除的数据。

触发器的一些常见用途:

  • 保证数据一致。
  • 基于某个表的变动在其他表上执行活动。
  • 进行额外的验证并根据需要回退数据。
  • 计算计算列的值或更新时间戳。

创建一个触发器,它对所有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;

一般来说,约束的处理比触发器快,因此在可能的时候,应该尽量使用约束。

4.数据库安全

大多数的DBMS都给管理员提供了管理机制,可利用管理机制授予或限制对数据的访问。

任何安全系统的基础都是用户授权和身份确认。这是一种处理,通过这种处理对用户进行确认,以保证其为有权用户,允许执行其试图执行的操作。有的DBMS为此目的结合使用了操作系统的安全措施,而有的维护自己的用户及密码列表,还有一些结合使用外部目录服务服务器。

需要保护的操作:

  • 对数据库管理功能的访问。
  • 对特定数据库或表的访问。
  • 访问的类型。
  • 仅通过视图或存储过程对表进行访问。
  • 创建多层次的安全措施,从而允许多种基于登录的访问和控制。
  • 限制管理用户账号的能力。

安全性通过SQL的GRANT和REVOKE语句来管理,不过,大多数DBMS提供了交互式的管理使用程序,这些使用程序在内部使用GRANT和REVOKE语句。

22 高级SQL特性的更多相关文章

  1. 高级SQL特性

    SQL   SQL 必知必会·笔记<20>高级SQL特性 摘要: 约束(constraint)就是管理如何插入或处理数据库数据的规则.DBMS通过在数据库表上施加约束来实施引用完整性.1. ...

  2. SQL 必知必会·笔记<20>高级SQL特性

    1. 约束 约束(constraint)就是管理如何插入或处理数据库数据的规则.DBMS通过在数据库表上施加约束来实施引用完整性. 1.1 主键 主键是一种特殊的约束,用来保证一列(或一组列)中的值是 ...

  3. 高级OOP特性(6)

    PHP不支持的高级OPP特性 PHP不支持通过函数重载实现多态 PHP不支持多重继承 PHP不支持根据所修改数据类型为操作符赋予新的含义 对象克隆 克隆实例 在对象前面添加clone关键字来克隆对象, ...

  4. [转]高级SQL注入:混淆和绕过

    ############# [0×00] – 简介[0×01] – 过滤规避(Mysql)[0x01a] – 绕过函数和关键词的过滤[0x01b] – 绕过正则表达式过滤[0×02] – 常见绕过技术 ...

  5. Redis数据库高级实用特性:持久化机制

    Redis数据库高级实用特性:持久化机制 大型web系统数据缓存设计 Redis高级特性:虚拟内存的使用技巧 Redis高级实用特性:安全性与主从复制 Memcached.Redis OR Tair

  6. (4.22)sql server视图/索引视图概念

    (4.22)sql server视图 关键词:sql server视图.索引视图 SQL Server视图是由SQL语句组成的逻辑数据库对象.它也可以称为由SQL语句组成的虚拟表,该SQL语句可能包含 ...

  7. Redis学习第八课:Redis高级实用特性(二)

    Redis高级实用特性 4.持久化机制 Redis是一个支持持久化的内存数据库,也就是说Redis需要经常将内存中的数据同步到硬盘来保证持久化.Redis支持两种持久化方式:(1).snapshott ...

  8. Redis学习第八课:Redis高级实用特性(一)

    Redis高级实用特性 注:我学习的环境是vmware7.1 + ubantu10.10+ redis 3.0.2 1.安全性 设置客户端连接后进行任何其他指定前需要的密码.因为redis速度相当快, ...

  9. 50道高级sql练习题;大大提高自己的sql能力(附具体的sql)

    问题及描述:--1.学生表Student(SID,Sname,Sage,Ssex) --SID 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别--2.课程表Course(CID ...

随机推荐

  1. iOS之GCD的局部解析

    一什么是GCD :(Grand [伟大] Central [中央]  Dispatch[调度]) GCD又名“伟大的中央调度器”,他是iOS4后才引进的一种多线程技术.开发者只需定义想执行的任务兵追加 ...

  2. 使用JSON进行数据传输的总结

    一.选择的意义 在异步应用程序中发送和接收信息时,可以选择以纯文本和 XML 作为数据格式.为了更好的使用ajax, 我们将学习一种有用的数据格式 JavaScript Object Notation ...

  3. linux之磁盘配额(quota)

    1.什么是quota 简单的说就是限制用户对磁盘空间的使用量. 因为Linux是多用户多任务的操作系统,许多人共用磁盘空间,为了合理的分配磁盘空间,于是就有了quota的出现. 2.quota的用途  ...

  4. C# Exception的子类Serializable警告

    编译时发出的警告:警告 CA2237[1] 将 [Serializable] 添加到 'HardwareException',原因是此类型实现了 ISerializable. Cause[1] An ...

  5. 每日一词【命令行CMD】

    CURL 中文:命令行URL下载 英文解释:CommendLine Uniform Resource Locator 使用场景: 文件传输 curl是利用URL语法在命令行方式下工作的开源文件传输工具 ...

  6. 深入浅出ExtJS 第三章 表格控件

    3.1 表格的特性简介 >.Ext中的表格功能:包括排序/缓存/拖动/隐藏某一列/自动显示行号/列汇总/单元格编辑等实用功能; >.表格由类Ext.grid.GridPanel定义,继承自 ...

  7. How Old Are You?

    今天要分享的是一个测年龄的小应用,就类似是http://how-old.net官网测年龄的功能一样,我的也是这样一个功能,细节捕获当然没有how-old多啦,不过这些主要是基于一个第三方的jar包,我 ...

  8. Part 82 to 85 Talking about Generic queue, stack collection class

    Part 82   Generic queue collection class Part 83   Generic stack collection class Part 84   Real tim ...

  9. Python调用Webservice、访问网页

    昨天在调试Webservice的时候,由于不想写测试程序,就想用Python访问Webservice,结果还是相当的麻烦.远没有VSIDE用的方便 不得不说VS还是很强大的,人性化做的很好,不需要你看 ...

  10. Cocos2d-x中的字符串

    在Cocos2d-x中能够使用的字符串constchar*.std::string和cocos2d::__String等,其中const char*是C风格的字符串,std::string是C++风格 ...