barriers / 阅读 / 详情

如何读取DBF文件中作了删除标记的记录

2023-07-07 00:15:41
TAG: bf 文件 db dbf
共3条回复
clou

Deleted=NO 不识别删除标记

Deleted=YES 识别删除标记

例如:xxx.dbf 文件中有数据①和数据②,数据①为打删除标记,数据②为不打删除标记

Dim ConDBF1 As New ADODB.Connection

Dim rsDbf1 As New ADODB.Recordset

FPath = "C:ADMINDesktopxxx"

fileName = "XXX.dbf"

strCnn = "driver=MicroSoft Visual Foxpro Driver;SourceDB=" & FPath & ";SourceType=DBF;Deleted=NO;"

ConDBF1.Open strCnn

rsDbf1.Open "select * from " & fileName, ConDBF1, adOpenStatic

Debug.Print rsDbf1.RecordCount

当 Deleted=NO ,结果为2条

当 Deleted=YES ,结果为1条

nicehost

vc DBF格式文件如何删除一条记录,直接删除不用数据库方法,有人知道怎么删除先把该行做删除标记,然后用pack就行了 先用delete命令,再用pack命令 单击

皮皮

条件用下列方式即可。

for Deleted()

相关推荐

deleate是什么意思

删除
2023-07-06 20:48:202

Delete什么意思

delete英 [dɪˈli:t] 美 [diˈlit] vt.& vi.删除第三人称单数: deletes 现在分词: deleting 过去式: deleted 过去分词: deleted双语例句 He also deleted files from the computer system 他还从计算机系统里删除了文件。
2023-07-06 20:48:502

Delete翻译

删除
2023-07-06 20:49:194

DeIete这个英语怎么读

delete 英[du026au02c8li:t] 美[diu02c8lit] vt. 删除; [例句]He also deleted files from the computer system他还从计算机系统里删除了文件。
2023-07-06 20:49:262

delete过去式

delete的过去式是deleted。delete是指删除,常用于编程语言中(C++,SQL等等)。new/delete的使用(仅限于c++,注意,new、delete不是函数而是操作符!注意与c中的malloc和free区分)编程的时候经常要用到堆内存的分配,通常使用的操作符是new,这个时候就必然要用到delete去释放申请的内存空间。此时至少要遵循以下原则(1)new和delete是成对出现的。只出现一个是错误的或不规范的写法,即使能编译通过,也会有安全隐患。(2)使用的new与delete要相同。也就是说如果你在 new表达式中使用了【】,你必须在对应的delete表达式中使用【】。如果你在new表达式中没有使用【】,你也不必在对应的delete表达式中使用。(3)对一个指针只能使用一次运算符delete。Delete()删除字符串S中从第Index个字符开始的Count个字符。若Index超出了S的长度,则不执行删除的操作。若Index+Count超出了S的长度,则删除从Index到S末尾的字符。若Index或Count出现负数,则不执行删除的操作。
2023-07-06 20:49:331

英语delete和delegation区别是什么?

delete是动词,意思是“删除”;delegation是名词,意思是“代表团”。
2023-07-06 20:49:544

git+status列出的deleted的怎么处理

deleted 是你把文件删除了, 不用管他.提交后代码库就会把这个文件删除的
2023-07-06 20:50:124

如何使用DELETED语句删除数据?

1、sql中使用DELETE 语句删除表中的行。按条件删除数据的基本语法是“DELETE FROM 表名称 WHERE 列名称 = 值”,这里以学生表举列,学生有姓名(name)和年龄(age)两列:2、首先需要查询张三的数据,输入sql语句“SELECT * FROM student WHERE `name` = "张三"”,即可查询到张三的数据:3、然后输入删除学生张三数据的sql语句“DELETE FROM student WHERE `name` = "张三"就删除成功了:
2023-07-06 20:50:191

临时表inserted表和deleted表有什么作用

inserted表和deleted表用于存放对表中数据行的修改信息,他们是触发器执行时自动创建的,放在内存中,是临时表。当触发器工作完成,它们也被删除。它们是只读表,不能向它们写入内容。inserted表:用来存储INSERT和UPDATE语句所影响的行的副本。意思就是在inserted表中临时保存了被插入或被更新后的记录行。在执行 INSERT 或UPDATE 语句时,新加行被同时添加到inserted表和触发器表中。因此,可以从inserted表检查插入的数据是否满足需求,如不满足则回滚撤消操作。deleted表:用来存储DELETE和UPDATE语句所影响行的副本。意思是在delete表中临时保存了被删除或被更新前的记录行。在执行 DELETE 或 UPDATE 语句时,行从触发器表中删除,并传到deleted表中。所以可以从deleted表中检查删除的数据行是否能删除。
2023-07-06 20:50:541

inserted、deleted在SQL Server中是什么意思?

从临时表 delete中获取要删除的售货员工编号select @Empid=编号 from deleted--从sell表中删除该员工的销售记录delete from Sell where 售货员工编号=@Empidend可以定义一个无论何时用INSERT语句向表中插入数据时都会执行的触发器。当触发INSERT触发器时,新的数据行就会被插入到触发器表和inserted表中。inserted表是一个逻辑表,它包含了已经插入的数据行的一个副本。i变量是在批处理或过程的主体中用 DECLARE 语句声明的,并用 SET 或 SELECT 语句赋值。游标变量可使用此语句声明,并可用于其他与游标相关的语句。除非在声明中提供值,否则声明之后所有变量将初始化为 NULL
2023-07-06 20:51:011

inserted、deleted在SQL Server中是什么意思

简单的给你解释下吧 在delete数据的时候,可以假定数据库将要删除的数据放到一个deleted临时表中,我们可以向读取普通的表一样,select 字段 from deleted 而insert的时候道理一样,只不过是把要插入的数据放在inserted表中。 更新操作可以认为是执行了两个操作,先把那一行记录delete掉,然后再insert,这样update操作实际上就对deleted表和inserted表的操作,所以不会有updated表了。
2023-07-06 20:51:091

SQL试题:哪种操作会导致触发器产生deleted表?

答案是D触发器操作新数据时会用到inserted表。用旧数据会用到deleted表用户执行insert操作,触发器里只有inserted表有数据,因为插入数据操作是没有旧数据的用户执行update操作,触发器里不但inserted表有数据,deleted表也有数据用户执行delete操作,触发器里只有deleted表有数据 ,因为删除数据操作是没有新数据的求采纳
2023-07-06 20:51:191

delete怎么读音 delete的意思

1、delete的单词发音:英[du026au02c8liu02d0t]美[du026au02c8liu02d0t]。 2、delete是一个英文单词,动词,作动词时意为“删除”。 3、第三人称单数:deletes 现在分词:deleting 过去式:deleted 过去分词:deleted
2023-07-06 20:51:251

什么是Inserted表? 什么是Deleted表?

Inserted表和Deleted表。此二表仅仅在触发器运行时存在。你可以使用该两个表来精确地确定触发触发器的动作对数据表所做的修改。比如,通过检查Deleted表,你可以确定那些记录由某一动作删除。如下例:CREATE TRIGGER tr_webusers_delete ON webusersFOR DELETEASINSERT weblog (activity) SELECT user_name FROM Deleted该触发器自动地创建一个webusers表的记录。当在webusers表内删除一个用户的姓名时,触发器会自动地把该姓名插入到weblog表中。假设你一不小心执行了下面的语句:DELETE webusers该语句会删除在webusers表内的所有记录。一般地,这些记录会永久地丢失,然而上面的触发器会在有记录从webusers表中删除时自动的触发。该触发器会检查表Deleted来确定有那些在webusers表内的记录被删除,并且把所有删除了的记录拷贝到weblog表中。为了恢复那些意外被删除的记录,你可以使用INSERT和SELECT语句再一次把它们从weblog表中拷贝到webusers表中。如果你不能允许意外地丢失一条记录时,你可以使用上面的方法来创建一个表内数据的备份。Deleted表和有记录被删除的表的列结构一模一样。在前面的例子内,Deleted表具有和webusers表相同的结构。现在假定你想跟踪所有插入某一表格的记录。比如,你想把每一条插入webusers表内的记录都在weblog表内做备份,你可以使用下面的触发器来完成该任务:CREATE TRIGGER tr_webusers_insert ON webusersFOR INSERTAS INSERT weblog(activty) SELECT user_name FROM INSERTED该触发器和前面的触发器非常相似,除了以下两点以外:该触发器在有记录插入表格webusers时触发;该触发器是FOR INSERT。该触发器把记录从Inserted表拷贝到weblog表内。Inserted表内包含了所有已经插入到表内的新记录。假如一个新用户的姓名插入到webusers表内时,触发器会自动地把新的用户姓名从webusers表拷贝到weblog表内。当你想使用一个简单的表来记录所有发生在你数据库中一个非常重要的表的动作时,这种复制数据的方法非常有用。你可以使用该表来获得对你的数据库的活动的记录,并且可以用于记录和诊断一些可能发生的问题。Inserted表和Deleted表仅仅在触发器在执行时存在,这一点是非常重要的,我们一定要明确。它们在某一特定时间和某一特定表相关。一旦某一个触发器结束执行时,相应的在两个表内的数据都会丢失。如果你想创建一个在任意一个这些表内数据的永久拷贝,你需要在触发器内把这些表内的数据拷贝到一个永久的表内。
2023-07-06 20:51:351

sql有没有deleted表

有的吧,一样的使用方法
2023-07-06 20:51:423

键盘上的delete是什么意思

删除你光标后面的那个字符,相当于反方向的退格键
2023-07-06 20:51:593

sql server 2005在使用触发器时,INSERTED表和DELETED表的作用是什么?

DML 触发器语句使用两种特殊的表:删除的表和插入的表。SQL Server 2005 会自动创建和管理这两种表。您可以使用这两种驻留内存的临时表来测试特定数据修改的影响以及设置 DML 触发器操作条件。但不能直接修改表中的数据或对表执行数据定义语言 (DDL) 操作,例如 CREATE INDEX。删除的表用于存储 DELETE 和 UPDATE 语句所影响的行的副本。在执行 DELETE 或 UPDATE 语句的过程中,行从触发器表中删除,并传输到删除的表中。删除的表和触发器表通常没有相同的行。插入的表用于存储 INSERT 和 UPDATE 语句所影响的行的副本。在执行插入或更新事务过程中,新行会同时添加到 inserted 表和触发器表中。插入的表中的行是触发器表中的新行的副本。更新事务类似于在删除操作之后执行插入操作;首先,旧行被复制到删除的表中,然后,新行被复制到触发器表和插入的表中。在设置触发器条件时,应使用激发触发器的操作相应的插入的和删除的表。尽管在测试 INSERT 时引用删除的表或在测试 DELETE 时引用插入的表不会导致任何错误,但在这些情况下,这些触发器测试表将不包含任何行。
2023-07-06 20:52:242

delete怎么读

delete 英[du026a"li:t] 美[diu02c8lit] vt.& vi. 删除 第三人称单数:deletes;过去分词:deleted;现在分词:deleting;过去式... [例句]Delete old entries in the paired devices list.删除已配对设备列表中的陈旧条目。
2023-07-06 20:52:431

sql中删除一条记录是保存在deleted中,那删除多条是保存在是什么地方呢?

deleted表会保存删除操作全部数据,可以利用触发器,将删除内容保存到实体表中
2023-07-06 20:52:502

SQL触发器

楼主,其实我也想问这个问题的
2023-07-06 20:53:014

请问SQL触发器使用Deleted为什么没有执行?

badgenumber=name--编译通过了吗
2023-07-06 20:53:184

delete的正确读音是什么是“底累特”

是碟力特希望可以帮助到你
2023-07-06 20:53:265

WIN10 windowsapps只有deleted文件

试试下面的方法:卸载所有第三方防护软件管家类软件。点击开始——Windows Powershell——右键点击 Windows Powershell——更多——以管理员身份运行,输入:add-appxpackage -register "C:Program FilesWindowsAppsMicrosoft.WindowsStore_2015.7.22.0_x64__8wekyb3d8bbweappxmanifest.xml" -disabledevelopmentmode回车。如果不行,就只能重装系统了。
2023-07-06 20:53:431

在SQL触发器中如何进deleted表的遍历

看你要如何操作.比如你是要做 删除日志类操作,那么直接INSERT INTO 日志表 SELECT * FROM deleted;SQLServer 简单的触发器的例子 - inserted 与 deleted的使用http://hi.baidu.com/wangzhiqing999/blog/item/6a325cbb7601cf1f18d81f60.html但是如果你是要做复杂的操作,比如删除一个,要检索其他的表,去核对数据,判断是否允许检查之类的操作的话。那么你可能需要用 游标来遍历 deleted表SQL Server 游标处理http://hi.baidu.com/wangzhiqing999/blog/item/49b9c7280c4963e28b139970.html
2023-07-06 20:54:131

sql中在触发器设计中,什么时候用到inserted表?什么时候用到deleted表?

需要触发器操作新数据时用到inserted表,也就是说inserted是新数据表需要触发器操作新旧据时用到deleted表,也就是说deleted是旧数据表如:用户执行insert操作,触发器里只有inserted表有数据,因为插入数据操作是没有旧数据的用户执行update操作,触发器里不但inserted表有数据,deleted表也有数据用户执行delete操作,触发器里只有deleted表有数据 ,因为删除数据操作是没有新数据的
2023-07-06 20:54:401

git deleted状态怎么处理

git ls-files -d | xargs echo -e | xargs git checkout --
2023-07-06 20:54:481

deletedscenes和zero区别

danger(n)危险的名词dangerou(adj)s危险的形容词endanger(v)危险的动词意思:使~~陷入危险endangerment(n)是用构词法组成的一个单词把endanger由动词变成了名词意思:危及
2023-07-06 20:54:553

D盘里的文件夹我直接给deleted了,但是控制面板-程序里还有这个软件,点击卸载,已经卸载不了。

重新安装下,然后再卸载,行不?
2023-07-06 20:55:033

this page has been deleted是什么意思

该网页已被删除~
2023-07-06 20:55:127

deleted_count电脑弹窗关不掉

题主是否想询问“deleted_count电脑弹窗为什么关不掉”?未删除弹窗文件。当电脑出现deleted_count弹窗时,如果不删除该弹窗文件将无法彻底关闭,需要在控制面板中,找到该弹窗文件位置结束此程序,然后删除该文件。
2023-07-06 20:55:251

deleted_count电脑弹窗关不掉

你好,你想问为什么deleted_count电脑弹窗关不掉?deleted_count电脑弹窗关不掉是因为频繁操作导致的系统反应慢,无法关掉。deleted_count电脑弹窗是提示此文件已经删除,关不掉是因为频繁操作导致的系统反应慢,可建议耐心等待一会,或者在最下方的任务管理器中清除任务试试。还关不掉弹窗,考虑是由于设备中病毒导致的,建议使用正规的杀毒软件进行杀毒处理。
2023-07-06 20:55:321

谁能解释一下sql server中这个触发器语句啊?

deleted 是一个系统临时表,删除的数据存储在这个表中。return 没什么意义,简单返回,这个触发器建立在student表上,当删除此表数据时,同时删除COURSE 表中对应学生的数据。
2023-07-06 20:55:392

SQL From BorrowRecord br , Deleted d ,Inserted i --Deleted和Inserted临时表中i,br,d是缩写么?

代词而已
2023-07-06 20:55:462

have deleted是什么时态

这样的话,那应该是have,that 引导的是同位语从句,说明是什么样的害怕.如果有have,后面应该是got.但是这样时态就不吻合了,事情还没有发生,就不用完成时,直接说get deleted,构成系表结构.
2023-07-06 20:55:531

sql server 2005 update 触发器

CREATETABLEA(AIDINTIDENTITY(1,1)PRIMARYKEY,moneyINT);CREATETABLEB(BIDINTIDENTITY(1,1)PRIMARYKEY,moneyINT);goCREATETRIGGERAfterUpdateAONAFORINSERT,UPDATE,DELETEASBEGINIFEXISTS(SELECT1FROMinserted)ANDNOTEXISTS(SELECT1FROMdeleted)BEGIN--插入触发.INSERTINTOBSELECTinserted.moneyFROMinserted;END;IFEXISTS(SELECT1FROMinserted)ANDEXISTS(SELECT1FROMdeleted)BEGIN--更新触发.INSERTINTOBSELECTinserted.money-deleted.moneyFROMinserted,deletedWHEREinserted.AID=deleted.AID;END;IFNOTEXISTS(SELECT1FROMinserted)ANDEXISTS(SELECT1FROMdeleted)BEGIN--删除触发INSERTINTOBSELECT0-deleted.moneyFROMdeleted;END;END;go--一条SQL语句,插入一条数据INSERTINTOAVALUES(100);--一条SQL语句,插入多条数据INSERTINTOASELECT10UNIONALLSELECT20;GO--一条SQL语句,更新一条数据UPDATEASETmoney=money-50WHEREAID=1;--一条SQL语句,更新多条数据UPDATEASETmoney=money+50WHEREAID!=1;GO--一条SQL语句,删除一条数据DELETEFROMAWHEREAID=1;--一条SQL语句,删除多条数据DELETEFROMAWHEREAID!=1;GO1>SELECT*FROMB2>GOBIDmoney----------------------11002203104-505506507-508-709-60(9行受影响)
2023-07-06 20:56:552

分色预览时显示有Deleted Global Color ,怎去掉呢?

第69回 弄小巧用借剑杀人 觉大限吞生金自逝 第70回 林黛玉重建桃花社 史湘云偶填柳絮词第71回 嫌隙人有心生嫌隙 鸳鸯女无意遇鸳鸯 第72回 王熙凤恃强羞说病 来旺妇倚势霸成亲
2023-07-06 20:57:022

只有在删除(DELETE)时才触发此触发器

触发器本来就是在指定的事件下才触发的,你是不是写得有问题,先写个简单的再把逻辑复杂化吧,不要一次性想把事情做完
2023-07-06 20:57:092

Deleted Items文件夹被移动到了其他子文件夹下,如何移回来

MFCMAPI工具的下载链接http://mfcmapi.codeplex.com通常这种问题我们可以利用MFCMAPI工具来修复,请按下列步骤来将Deleted Items文件夹移到原始位置。1. 打开该用户的Outlook, 将Outlook 切换到Online(un-cache)模式。2. 关闭Outlook,启动MFCMAPI.exe。点击"OK"3. 在菜单栏选择"Session" -> "Login and Display Store Table"4. 选择用户的配置文件,然后点 "OK"5. 双击用户的mailbox,6. 展开"Root Container"->"Top of Information Store"7. 找到"Deleted Items"。 此例中展开"Contacts" -> "Deleted Items"8. 右击 "Deleted Items" 选择 "Copy"9. 右击"Top of Information Store", 选择"Paste",点击OK,将COPY_SUBFOLDERS和FOLDER_MOVE前面的勾打上,点击"OK"10. 关闭MFCMAPI.exe,启动Outlook.请检查Deleted Items文件夹是否已移到原始位置。
2023-07-06 20:57:161

Sql Server 触发器问题,触发器触发的条件有 insert,update,delete ,我想要一个例子 在一个表建立一个触

declare @tmp varchar(10)select @temp=a from insertedinsert b values(@tmp)
2023-07-06 20:57:262

电脑卡主死机按ctrl+alt+deleted或者ctrl+esc都没用怎么办

强制关机,或者拔电
2023-07-06 20:57:333

microsoftvisualfoxpro逻辑删除怎么弄

在 Microsoft Visual FoxPro 中实现逻辑删除操作,有以下两种方式:1. 添加一列记录标记通过在数据表中添加一个记录标记标识符,可以对记录进行逻辑删除。具体操作步骤如下: - 在数据表中添加一个名为“DELETED”的逻辑型字段,默认值为false。 - 在数据表中创建一个名为“DELETE”或“REMOVE”的查询(query),满足删除操作的条件,如“DELETE FROM tablename WHERE condition”。 - 在应用程序的业务逻辑中,代替物理删除操作,将这个记录标记字段设置为true,表示这条记录处于删除状态,但实际上数据表中仍保留该记录和其数据。 - 在数据表中查询数据时,过滤掉那些deleted字段为true的记录。2. 在物理表中保留已删除记录另一个实现逻辑删除的方法是在数据表中添加一个包含已删除记录的物理表,并使用联接查询(join query)过滤掉已删除的记录。具体步骤如下: - 在数据表中添加一个名为“DELETED_DATA”或“HISTORY”的物理表,用于存储删除的记录信息。 - 在数据表中创建一个名为“DELETE”或“REMOVE”的查询(query),满足删除操作的条件,如“DELETE FROM tablename WHERE condition”。 - 在应用程序的业务逻辑中,代替物理删除操作,将删除的记录复制到“DELETED_DATA”表中,并在数据表中从数据表中删除这条记录。 - 在查询数据时,通过联接查询(join query)将“DELETED_DATA”表与数据表联接起来。这样查询时,被删除的记录也能够被查询出来。需要注意的是,无论是哪种方式,都需要对应用程序中的相关业务逻辑进行调整,确保数据的正确性和完整性。
2023-07-06 20:57:401

在Sql Server触发器中判断操作是Insert还是Update还是Delete

DECLARE@IsInsert bit,@IsUpdate bit,@IsDelete bitIF EXISTS(SELECT 1 FROM inserted) AND NOT EXISTS(SELECT 1 FROM deleted)SET @IsInsert = 1ELSESET @IsInsert = 0IF EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted)SET @IsUpdate = 1ELSESET @IsUpdate = 0IF NOT EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted)SET @IsDelete = 1ELSESET @IsDelete = 0 create trigger Update_Del on Table for update,delete as if not exists(select 1 from inserted) begin /*inserted表无记录,是删除*/ end else begin /*是更新*/ end go关键在于Inserted表触发器语句中使用了两种特殊的表:deleted 表和 inserted 表。Deleted 表用于存储 DELETE 和 UPDATE 语句所影响的行的复本。在执行 DELETE 或 UPDATE 语句时,行从触发器表中删除,并传输到 deleted 表中。Deleted 表和触发器表通常没有相同的行。Inserted 表用于存储 INSERT 和 UPDATE 语句所影响的行的副本。在一个插入或更新事务处理中,新建行被同时添加到 inserted 表和触发器表中。Inserted 表中的行是触发器表中新行的副本。1.插入操作(Insert) Inserted表有数据,Deleted表无数据2.删除操作(Delete) Inserted表无数据,Deleted表有数据3.更新操作(Update) Inserted表有数据(新数据),Deleted表有数据(旧数据)
2023-07-06 20:57:471

数据库触发器问题

弱弱的问一句010应该不数字吧,字符的话是不能比较大小的,另外触发器是要有触发条件的(更新,删除,插入),“如果超过010”这个条件显然不是一个动作,貌似不能作为触发条件,貌似直接用一个简单UPDate语句就能完成,
2023-07-06 20:58:042

在sql触发器中如何获得被修改行的ID

new.idnew.数据列
2023-07-06 20:58:302

SQL触发器同步删除数据要怎么写?

CREATE TRIGGER A_DEL ON [读者] FOR DELETEAS --SET NOCOUNT ON DELETE E FROM [读者] E INNER JOIN deleted [借书] ON E.[读者编号] = [借书].[读者编号]
2023-07-06 20:58:403

sql server里面的触发器怎么写?

基本语法格式create trigger tri_nameon tablefor insert/update/deletedasSQL code例:create trigger tri_mc(tri_mc:自定义触发器的名称)on table (table:触发的表名)for insert (触发类型:insert,插入数据触发 update,更新数据触发 delete,删除数据触发)asdeclare @kssj datetime (定义一个变量,做中间处理)declare @sqbh char(40)select @kssj = kssj,@sqbh = sqbh from inserted(插入数据时,插入的数据在表 inserted更新数据时,更新后的数据在表 inserted 更新前的数据在表中 deleted删除数据时,删除的数据在表 deleted不同的操作可以,取出不同的中间数据,做处理,例子中取出插入的数据)update table2 set isks = 1,kksj = @kssj where sqbh = @sqbh(根据中间处理做相应操作,例子的处理为,将插入的值同步更新到另一个表)
2023-07-06 20:58:504

关于SQL触发器的问题 ?同时删除多行,这些行插入到另一张表中?

不用那么麻烦触发器里的内容直接如下insertintodelclasslist(StuID,Student,fid,StuClass,Teacher,cid)selectstuid,student,fid,stuclass,teacher,idfromdeleted就可以了,你懂的。
2023-07-06 20:59:041

关于SQL Server触发器instead of delete 使用问题

替代了 原来delete的触发
2023-07-06 20:59:121

.net连接SAP Cannot get a client connection: invalid destination PRD_000 (DELETED)

看英文都知道是连接不通 啊
2023-07-06 20:59:222

数据是否删除?isDeleted的软删除还是从数据库里硬删除

作为对Ayende文章的回应,Udi Dahan强烈建议完全避免数据删除。所谓软删除主张在表中增加一个IsDeleted列以保持数据完整。如果某一行设置了IsDeleted标志列,那么这一行就被认为是已删除的。Ayende觉得这种方法“简单、容易理解、容易实现、容易沟通”,但“往往是错的”。问题在于:删除一行或一个实体几乎总不是简单的事件。它不仅影响模型中的数据,还会影响模型的外观。所以我们才要有外键去确保不会出现“订单行”没有对应的父“订单”的情况。而这个例子只能算是最简单的情况。……当采用软删除的时候,不管我们是否情愿,都很容易出现数据受损,比如谁都不在意的一个小调整,就可能使“客户”的“最新订单”指向一条已经软删除的订单。如果开发者接到的要求就是从数据库中删除数据,要是不建议用软删除,那就只能硬删除了。为了保证数据一致性,开发者除了删除直接有关的数据行,还应该级联地删除相关数据。可Udi Dahan提醒读者注意,真实的世界并不是级联的:假设市场部决定从商品目录中删除一样商品,那是不是说所有包含了该商品的旧订单都要一并消失?再级联下去,这些订单对应的所有发票是不是也该删除?这么一步步删下去,我们公司的损益报表是不是应该重做了?没天理了。问题似乎出在对“删除”这词的解读上。Dahan给出了这样的例子:我说的“删除”其实是指这产品“停售”了。我们以后不再卖这种产品,清掉库存以后不再进货。以后顾客搜索商品或者翻阅目录的时候不会再看见这种商品,但管仓库的人暂时还得继续管理它们。“删除”是个贪方便的说法。他接着举了一些站在用户角度的正确解读:订单不是被删除的,是被“取消”的。订单取消得太晚,还会产生花费。员工不是被删除的,是被“解雇”的(也可能是退休了)。还有相应的补偿金要处理。职位不是被删除的,是被“填补”的(或者招聘申请被撤回)。在上面这些例子中,我们的着眼点应该放在用户希望完成的任务上,而非发生在某个实体身上的技术动作。几乎在所有的情况下,需要考虑的实体总不止一个。为了代替IsDeleted标志,Dahan建议用一个代表相关数据状态的字段:有效、停用、取消、弃置等等。用户可以借助这样一个状态字段回顾过去的数据,作为决策的依据。删除数据除了破坏数据一致性,还有其它负面的后果。Dahan建议把所有数据都留在数据库里:“别删除。就是别删除。
2023-07-06 20:59:321