16ESQLC中的数据库删除和修改操作.docx

上传人:b****5 文档编号:6141689 上传时间:2023-01-04 格式:DOCX 页数:14 大小:1.30MB
下载 相关 举报
16ESQLC中的数据库删除和修改操作.docx_第1页
第1页 / 共14页
16ESQLC中的数据库删除和修改操作.docx_第2页
第2页 / 共14页
16ESQLC中的数据库删除和修改操作.docx_第3页
第3页 / 共14页
16ESQLC中的数据库删除和修改操作.docx_第4页
第4页 / 共14页
16ESQLC中的数据库删除和修改操作.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

16ESQLC中的数据库删除和修改操作.docx

《16ESQLC中的数据库删除和修改操作.docx》由会员分享,可在线阅读,更多相关《16ESQLC中的数据库删除和修改操作.docx(14页珍藏版)》请在冰豆网上搜索。

16ESQLC中的数据库删除和修改操作.docx

16ESQLC中的数据库删除和修改操作

第十六章

ESQL/C中的数据库删除和修改操作

本章介绍如何在SQL数据库中删除和修改记录,同时维持参照和数据完整性。

什么时候用户选择“D”或“U”来删除或修改记录,应修改哪个记录?

通常我们会修改当前查看的记录。

在大多数情况下,如我们的例子所示,用户必须先查询表。

这里是所发生的事情:

1.用户进行一次查询。

2.程序为查询设置和打开一个滚动游标。

3.程序把满足查询的第一个记录取出来,放到结构Cust_1中。

当用户浏览活动集时,程序把每一条查看到的记录依次存放到Cust_1中,并把它显示在屏幕上。

所以,当前显示的记录就是最近取出来的记录。

存放在Cust_1中的数据有一部分是客户的主键。

在该例子中,主键是customer_num。

所以,当一条记录显示在屏幕上时,例如,用户选择删除或修改该记录,只要简单地使用Cust_1中的customer_num值来定位要删除或修改的记录。

当删除一条记录时,要确保没有任何表中的记录依赖于要删除的记录。

例如,删除一个主键时,应当查看该值是否在别处作为外键。

这称为用于删除时的参照完整性。

在上面的例子中,如果要删除客户104,首先应当确定该客户没有打开的定单。

如果我们不检查就删除了客户,则可能有定单而不存在相关联的客户:

那么把货物运送到何处?

谁来付款?

参照完整性可以在模式层由DBA实现,可以在创建表时或创建表以后使用ALTER语句来实现。

模式层的完整性检查或许是最好的,因为它们由数据库服务器来自动完成。

应用程序不必考虑这些检查。

如果没有模式层的参照完整性检查,由于上面的原因,必须在程序中靠自己来实现它。

在稍后一些,将会看到一个怎样在程序中进行该项检查的例子。

上面是DELETE语句的语法。

DELETE语句只删除记录。

WHERE子句是可选的,如果省略它,数据库服务器删除表中的所有记录,此时,表还存在,但是为空。

如果有WHERE子句,只删除那些满足过滤条件的记录。

在该例子中,因为过滤条件是针对主键的,所以最多删除一条记录。

应该注意的是,当使用滚动游标浏览记录时,删除操作是针对基表的,而不是针对滚动游标设置的临时表的。

这意味着在执行删除操作之后,使用同一个游标向后滚动时,可能看到原先的记录,象这样的记录称之为幻影(phantom)。

上面是删除一条记录的例子函数的第1部分。

当在模式层没有定义参照完整性约束时,应当自己来实现。

删除记录时,应当先查看儿孙表中是否有相关联的记录。

在上面的例子中,既然我们要从客户表删除记录,所以先查看定单表,看看要删除的客户是否有任何打开的定单。

如果有,拒绝删除请求;否则,继续处理请求。

在删除记录时,总是在实际删除操作之前,得到一个最后的确认。

在上例中,我们列出了循环的开始部分,它所完成的正是确认工作。

假定用户确认要删除客户,则执行删除操作。

删除记录时,如果在过滤条件中使用了宿主变量,确信变量中存放有实际的值。

在例子里,我们确信用户先进行了一次查询,把结果值装入到cusotmer_num主键中。

为维护实际完整性,不应当让用户修改主键的值。

这样做可能会产生不良后果。

例如,如果我们获取并显示了客户108,用于存放客户记录的全局结构的CustNum域的值为108。

现在,假定可以让用户把该域的值修改为“114”。

当我们要进行记录修改时,要使用该域,因为它是主键,要通过它来定位和修改表中的记录。

数据库服务器定位的记录是114,该客户记录被修改!

而客户108的记录没有任何的改动!

糟糕。

把用户可以修改的域限制为主键的组成部分之外的域。

如果用户需要更改主键的值,可以先删除当前记录,而后得到主键一个新值,然后插入该记录作为一条新记录。

可以在模式层给特定的字段设置CHECKCONSTRAINTS,来实施值的检查。

上面是UPDATE语句的语法。

注意到WHERE子句是可选的,如果省略它,数据库服务器修改基表中的所有记录。

省略WHERE子句时,不会有自动的警告信息,就象在DB-Access中一样。

省略WHERE子句时,小心谨慎是程序员的责任。

在上面的例子中,针对主键有一个过滤条件。

这样,最多修改一条记录。

再次,应当确保用户不会更改主键的值。

当使用UPDATE语句来修改一个记录时,使得对基表的同一个记录重写。

应当注意的是,当使用滚动游标浏览记录时,修改操作是针对基表的,而不是针对滚动游标设置的临时表。

这意味着在执行修改操作之后,使用同一个游标向后滚动时,可能看到修改以前的记录。

上面是修改一个记录的例子代码的第一部分。

首先,将要存放更改后记录的结构被初始化。

该结构被赋予存放原先获取的记录的结构的值。

我们要修改的是update结构中的值,而不是存放原先获取的记录的结构的值。

接着,调用GetStock()函数来获取新值。

注意到该调用的第二个参数的的使用:

它是一个标志,指明我们不想提示用户为主键输入新值。

此时,准备要进行实际的修改。

上面的代码进行记录的实际修改工作。

要做的第一件事情是询问用户是否进行事实上的修改。

如果用户不想继续修改工作,取消该修改操作。

如果用户想继续进行修改工作,首先关闭以前的SQL错误捕获,以使用自己的错误捕获功能。

如果在修改记录之后,发现了SQL错误,则显示错误信息并返回。

如果没有发生任何错误,则显示一条确认修改成功的信息。

为完成修改记录程序,按照下面的步骤:

1.创建一个新的源文件stock_chng.ec以包括进一个新函数UpdateStock。

它应调用InputStock()来获取一个新值。

UpdateStock应修改当前的记录,当前记录使用上次习题中创建的滚动游标来查看。

使用主键stock_no和manu_code来修改当前的记录。

2.修改stock_main.ec文件中的驱动菜单在适当时调用UpdateStock()函数。

3.修改makefile以包括进新的模块。

4.重新生成执行程序。

5.运行程序并做下面的事情:

a)进行一次查询并选择一个记录来进修改。

b)修改记录。

限制用户修改主键是一个好主意。

为实现这点,传递给InputStock一个指示符,使它只为修改函数绕过stock_no和manu_code值的输入。

答案

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1