zoukankan      html  css  js  c++  java
  • 22 高级SQL特性

    1.约束

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

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

    • 如果在客户机层面上实施数据库完整性规则,则每个客户机都被迫要实施这些规则,但很可能会有一些客户机不实施这些规则。
    • 在执行UPDATEDELETE操作时,也必须实施这些规则。
    • 执行客户机端检查是非常耗时的,而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表中的订单通过客户IDCustomers表中特定行相关联。

    客户IDCustomers表的主键;每个客户都有唯一的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的列只包含MF,使用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.触发器

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

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

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

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

    触发器的一些常见用途:

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

    创建一个触发器,它对所有INSERTUPDATE操作,转换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为此目的结合使用了操作系统的安全措施,而有的维护自己的用户及密码列表,还有一些结合使用外部目录服务服务器。

    需要保护的操作:

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

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

  • 相关阅读:
    eclipse下c/cpp " undefined reference to " or "launch failed binary not found"问题
    blockdev 设置文件预读大小
    宝宝语录
    CentOS修改主机名(hostname)
    subprocess报No such file or directory
    用ldap方式访问AD域的的错误解释
    英特尔的VTd技术是什么?
    This virtual machine requires the VMware keyboard support driver which is not installed
    Linux内核的文件预读详细详解
    UNP总结 Chapter 26~29 线程、IP选项、原始套接字、数据链路访问
  • 原文地址:https://www.cnblogs.com/Sumomo0516/p/6131603.html
Copyright © 2011-2022 走看看