16ESQLC中的数据库删除和修改操作.docx
- 文档编号:6141689
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:14
- 大小:1.30MB
16ESQLC中的数据库删除和修改操作.docx
《16ESQLC中的数据库删除和修改操作.docx》由会员分享,可在线阅读,更多相关《16ESQLC中的数据库删除和修改操作.docx(14页珍藏版)》请在冰豆网上搜索。
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值的输入。
答案
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 16 ESQLC 中的 数据库 删除 修改 操作