暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

修改数据

promise 2021-12-08
487

1.修改数据库中的数据
下列语句修改数据:
• DELETE
• INSERT
• MERGE
• UPDATE
当与更高级的 SELECT 语句相比时,虽然这些 SQL 语句相对简单,但由于它们更改数据库的内容,因此请小心使用它们。
如果在查询期间系统硬件或软件出现故障,请考虑会发生什么。即使对应用程序的影响是严重的,也不会破坏数据库自身。然而,如果正在进行修改时系统发生故障,则数据库的
状态就不确定了。显然,处于不确定状态的数据库具有深远的影响。在数据库中删除、插入或更新行之前,请询问自己下列问题:
• 用户对数据库及其表的访问是否安全。即,是否将有限的数据库和表级别权限授予特定用户?
• 修改了的数据是否保持数据库现有的完整性?
• 系统的状况是否使其对可能导致系统或硬件故障的外部事件具有相对较强的免疫力?
如果对这些问题不能都回答“是”,也不用担心。对所有这些问题的解决方案都内建在 GBase8s 数据库服务器内。在对修改数据的语句进行描述之后,这部分讨论这些解决方案。

2.删除行

DELETE 从表中移除任何行或行的组合。在提交该事务之后,您不可恢复删除了的行。
(在 中断了的修改 之下讨论事务。现在,请将事务与语句看做是一回事。)
当删除一行时,您还必须小心地删除其值依赖于该删除了的行的其他表的任何行。如果数据库强制执行引用约束,则您可使用 CREATE TABLE 或 ALTER TABLE 语句的 ONDELETE CASCADE 选项来允许从与另一表的关系中的一个表进行级联删除。要获取关于引用约束和 ON DELETE CASCADE 选项的更多信息,请参阅 引用完整性。

3.插入行
INSERT 将新的一行或多行添加到表。该语句有两个基本功能。它可使用您提供的列值创建单个的新行,或可使用从其他表选择的数据创建一组新的行。

4.更新行
根据 SET 子句的规范,使用 UPDATE 语句来更改表的一个或多个现有行的内容。此语句采用两种根本不同的形式。一种允许您按名称将特定的值指定给列;另一种允许您将(可能是通过 SELECT 语句返回的)值的列表指定给列的列表。在任一情况下,如果您正在更新行,且某些列有数据完整性约束,则您更改的数据必须符合对那些列的限制。要获取更多信息,请参考 数据完整性。注: MERGE 语句是 UPDATE 语句的一种替代,可使用与 UPDATE 语句一样的 SET 子句语法来修改表的现有行中的一个或多个值。MERGE 语句执行源表与目标表的外部连接,然后以来自于连接的结果集的值更新目标表中的行,其连接谓词求值为 TRUE。MERGE 语句不更改源表中的值。除了更新行之外,MERGE 语句可可选地同时组合 UPDATE 与 INSERT 操作,或可同时组合DELETE 与 INSERT 操作而不更新任何行。要获取关于 Update 合并、Delete 合并和 Insert 合并的语法和限制的更多信息,请参阅《GBase 8s SQL 指南:语法》 中 MERGE 语句的描述。

5.对数据库级对其对象的权限
您可使用下列数据库权限来控制谁可访问数据库:
• 数据库级别权限
• 表级别权限
• 例程级别权限
• 语言级别权限
• 类型级别权限
• 序列级别权限
• 分片级别权限
本部分简要地描述数据库级别和表级别权限。要了解权限的列表以及 GRANT 和REVOKE 语句的描述,请参阅《GBase 8s SQL 指南:语法》。

6. 数据完整性
INSERT、UPDATE 和 DELETE 语句修改现有的数据库中的数据。每当您修改现有的数据时,就可影响数据的完整性。例如,可能会将不存在的产品的订单输入到 orders 表内,可能从 customer 表中删除一个有未完成订单的客户,或者可能在 orders 表中更新订单编号,但未在 items 表中更新。在每一这些情况下,都会失去存储的数据的完整性。数据完整性实际由下列部分组成:实体完整性表的每一行都有唯一的标识符。语义完整性列中的数据正确地反映设计了该列来保存的信息的类型。引用完整性强制执行表之间的关系。设计良好的数据库体现了这些原则,因此当您修改数据时,数据库本身防止您执行可能损坏数据完整性的任何操作。

7. 中断了的修改

即使所有软件都没有错误且所有硬件都完全可靠,计算机外部的世界也可干扰它。闪电可能击中建筑物,中断供电并在您的 UPDATE 语句运行期间停止计算机。当磁盘已满或用户提供不正确的数据时,更可能发生的情景是,导致您的多行插入过早停止并产生错误。在任何情况下,每当您修改数据,您必须假设某种不可预测的事件可中断该修改。当外部原因导致修改中断时,您不可确定该操作完成了多少。即使在单行操作中,您也不可知道是否正确地更新了到达了磁盘的数据或索引。如果多行修改是一个问题,则多语句修改就更糟。通常在程序中嵌入它们,因此您看不到正在执行的个别 SQL 语句。例如,要在演示数据库中输入新的订单,请执行下列步骤:
1. 在 orders 表中插入一行。(此插入生成一个订单编号。)
2. 对于订购的每一商品,在 items 表中插入一行。
存在两种编制订单输入应用程序的方法。一种方法是使它完全是交互的,以便程序立即插入第一行,然后在用户输入时插入每一商品。但这种方法使得操作可能遭遇许多更不可预测的事件:客户的电话电线,用户按错键,用户的终端或计算机断电,等等。
下列列表描述构建订单输入应用程序的正确方法:
• 以交互方式接受所有数据。
• 验证数据并展开它(例如,在 stock 和 manufact 中查找代码)。
• 在屏幕上显示信息以进行检查。
• 等待操作人员进行最终的提交。
• 快速地执行插入。
即使使用这些步骤,不可预测的情况还可在它插入该订单之后,但在它完成插入商品之前停止该程序。如果发生那种情况,则数据库处于不可预测的状态:它的数据完整性受到损害。

8.使用 GBase 8s 数据库服务器来备份和记录日志

通过使用事务,您可确保数据库始终处于一致的状态,且将您的修改正确地记录在磁盘上。但磁盘本身不十分安全。对于机械故障以及洪水、火灾和地震,它都是脆弱的。唯一的保护措施是保存数据的多个副本。这些冗余的副本称为备份副本。事务日志(也称为逻辑日志)补充数据库的备份副本。它的内容是自从上一次备份数据库以来发生了的所有修改的历史。如果您曾经需要从备份副本恢复数据库,则您可使用事务日志来将数据库向前滚到它最近的状态。数据库服务器包含完善的特性来支持备份和日志记录。您的数据库服务器归档和备份指南描述这些特性。数据库服务器对性能和可靠性有严格的要求(例如,它支持在正在使用数据库时制作备份
副本。)数据库服务器管理它自己的磁盘空间,这些空间专用于日志记录。数据库服务器使用有限的日志文件集来并发地执行所有数据库的日志记录。在事务为活动的时,可将日志文件复制到另一介质(备份)。数据库服务器从不需要考虑这些设置,因为 DBA 总是从中央位置管理它们。
GBase 8s 支持 onload 和 onunload 实用程序。使用 onunload 实用程序来制作单个数据库或表的个人备份副本。此程序将表或数据库复制到磁带。它的输出由磁盘页的二进制映像组成,如同在数据库服务器中存储了它们。因此,可快速地制作副本,且相应的 onload 程序可快速地恢复该文件。然而,对于任何其他程序,该数据格式没有意义。要获取关于如何使用 onload 和 onunload 实用程序的信息,请参阅《GBase 8s 迁移指南》。如果您的 DBA 使用 ON-Bar 来创建备份并备份逻辑日志,则您还可能能够使用 ON-Bar来创建您自己的备份副本。要获取更多信息,请参阅您的《GBase 8s 备份与恢复指南》。

9 .并发和锁定
如果在单个用户工作站中包含您的数据库,而没有网络将它连接到其他计算机,则并发并不重要。在所有其他情况下,您必须允许这样的可能性:当您的程序正在修改数据时,另一程序也正在读取或修改同一数据。并发涉及在同一时间对同一数据的两个或多个独立使用。在多用户数据库系统中,高级别的并发对良好的性能至关重要。然而,除非在数据的使用上存在控制,否则并发可导致各种负面的影响。程序可能读取过时的数据;即使表面上似乎成功地输入了修改,但修改可能丢失。要防止此类错误,数据库服务器强加一个锁定系统。锁定是程序可在一块数据上放置的声明或保留。只要数据被锁定,数据库服务器就保证其他程序不可修改它。当另一程序请求该数据时,数据库服务器或者让该程序等待,或者向它返回错误。要控制锁定对您的数据访问的影响,请使用 SQL 语句的组合:SET LOCK MODE 与或者SET ISOLATION 或者 SET TRANSACTION。在从程序内阅读关于游标的使用的讨论之后,您可了解这些语句的详细信息。在 SQL 编程 和 通过 SQL 程序修改数据 中讨论游标。要获取关于锁定和并发的更多信息,请参阅 对多用户环境编程。

10. GBase 8s  数据复制
从更广义上讲,术语数据复制意味着在多个不同的站点,数据库对象多次出现。例如,有一种复制数据的方式是将数据库复制到不同的计算机上的数据库服务器,这样,报告可针对该数据运行,而不干扰正在使用原始数据库的客户机应用程序。下列列表描述数据复制的优势:
• 与未复制的远程数据相对,在本地访问复制了的数据的客户机的性能提高,因为它
们无需使用网络服务。
• 使用复制了的数据,提高所有站点的客户机的可用性,因为如果本地的复制了的数据不可用时,尽管是远程地,该数据的一个副本仍可用。获得这些优势不是没有代价的。与非复制的数据相比,对于复制了的数据,数据复制显然需要更多的存储,且更新复制了的数据可比更新单个对象要花费更多处理时间。通过显式地指定应发现和更新数据的位置,可在客户机应用程序的逻辑中实际地实现数据复制。然而,归档数据复制的这种方式成本高、容易出错且难以维护。相反,数据复制的概念常常伴随着复制透明。复制透明是在数据库服务器内自动地处理定位和维护数据副本的详细信息的内建功能。在数据复制的大框架内,GBase 8s 数据库服务器几乎实现整个数据库服务器的透明的数据复制。复制一个数据库服务器管理的所有数据,并动态地在另一数据库服务器上更新,通常位于一远程站点。GBase 8s 数据库服务器的数据复制有时称为热站点备份,因为它提供一种维护整个数据库服务器的备份副本的方法,在发生灾难性故障时,可快速地使用它。由于数据库服务器提供复制透明,因此您通常不需要关注或注意到数据复制;DBA 会处理它。然而,如果您的机构决定使用数据复制,则您应注意到,在数据复制环境中,存在对于客户机应用程序的特殊连接性事项。在 GBase 8s 管理员指南 中描述这些事项。

11. 总结
通过数据库所有者授予您的权限来控制数据库访问。通常自动地授予您查询数据的权限,但通过特定的 Insert、Delete 和 Update 权限来控制修改数据的能力,以逐个表的方式授予这些权限。如果对数据库施加数据完整性约束,则您的修改数据的能力受到那些约束的限制。您的数据库级别权限和表级别权限以及任何数据约束控制您可如何以及何时修改数据。此外,数据库的对象模式和违反检测特性也影响您可修改数据的方式,并有助于保持您的数据的完整性。
您可使用 DELETE 语句从表删除一行或多行。它的 WHERE 子句选择这些行;使用带有相同子句的 SELECT 语句来预览这些删除。TRUNCATE 语句删除表的所有行。使用 INSERT 语句将行添加到表。您可插入包含特定的列值的单个行,或可插入 SELECT语句生成的一批行。使用 UPDATE 语句来修改现有的行的内容。您使用可包括子查询的表达式来指定新的内容,以便您可使用基于其他表或更新了的表自身的数据。该语句有两种形式。在第一种形式中,您逐列地指定新值。在第二种形式中,SELECT 语句或记录变量生成一组新值。使用 CREATE TABLE 和 ALTER TABLE 语句的 REFERENCES 子句来创建表之间的关系。REFERENCES 子句的 ON DELETE CASCADE 选项允许您使用一个 DELETE 语句来从父表和相关联的子表删除行。使用事务来防止在修改过程中不可预测的中断,防止数据库处于不确定的状态。当在一事务内执行修改时,会在发生错误之后回滚它们。事务日志还扩展数据库的定期制作的备份副本。如果必须恢复数据库,则它可将数据库返回到最近的状态。对用户为透明的数据复制提供另一种针对灾难性故障的保护。














「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论