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语句。

  • 相关阅读:
    shp转geojson
    Vue如何使用$refs
    Cesium加载轨迹
    Nodejs调用Python函数时传递参数
    JavaScript字符串截取:截取'final:'之后的字符串,然后再按照“,”分割。。
    Cesium平移操作
    架空输电线路障碍物巡检的无人机低空摄影测量方法研究
    cesium沿着路线飞行
    业界常用四种命名法则
    电脑优化
  • 原文地址:https://www.cnblogs.com/Sumomo0516/p/6131603.html
Copyright © 2011-2022 走看看