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. Android 高级UI设计笔记19:PopupWindow使用详解

    1. PopupWindow使用 PopupWindow这个类用来实现一个弹出框,可以使用任意布局的View作为其内容,这个弹出框是悬浮在当前activity之上的. 2. PopupWindow使用 ...

  2. 沈逸老师PHP魔鬼特训笔记(9)--进化

    回到第一课,我们学过PHP母体,了解过解析PHP程序.PHP其实内置了一个web服务器,专门给我们开发测试使用,那么接下来我们要完成的是:生成后创建一个web 服务,在浏览器中可以访问. PHP的母体 ...

  3. 【Mood-7】tell 2 my gf-miss u not sudden but always

    #sorry not coming 2 see u the national day holiday! I'm BULL in the land,fighting 4 u and babies!  # ...

  4. 【Android 界面效果14】RelativeLayout里常用的位置属性

    ------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- android:layout_toLeftOf—— 该组件位于引用组件的左方 android:layou ...

  5. ubuntu创建、删除文件及文件夹,强制清空回收站方法

    mkdir 目录名         => 创建一个目录 rmdir 空目录名      => 删除一个空目录 rm 文件名 文件名   => 删除一个文件或多个文件 rm –rf 非 ...

  6. Linux的SOCKET编程详解

    1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如 U ...

  7. 新颖的O2O商业模式,江水平和他的装修队

    文/秦刚 江水平是我微信上的朋友,有一天他给我留言说,秦刚老师我觉得你应该采访我,因为我的商业模式非常新颖有趣,应该能够给很多创业者启发. 我让江水平把他的商业模式写给我,他效率很高,一天就写好给我了 ...

  8. SQL跨服务器操作语句

    --简单的跨服务器查询语句 select * from opendatasource('SQLOLEDB', 'Data Source=192.168.0.1;User ID=sa;Password= ...

  9. html5+css3第一屏滚屏动画效果

    详细内容请点击 在线预览立即下载 html5+css3第一屏滚屏动画效果. 转载自:http://tympanus.net/codrops/2014/05/22/inspiration-for-art ...

  10. Ubuntu 16.04 Vysor 破解 和黑屏问题解决+ 闪屏问题解决

    最新破解更新说明: 参考本人blog: 点我呀 黑屏解决 Vysor使用和黑屏问题 经过了一段时间的艰辛探索,确定是我chrome的PNaCl没有安装,然后又是一段艰辛的Google之后,终于在一个链 ...