【发布时间】:2019-10-16 16:59:06
【问题描述】:
我有两张桌子。一个设备表和一个位置表。设备表中只能有一个设备,但位置表中可以有多个具有多个位置的设备。
如果用户删除设备,我还需要从位置表中删除具有相同 id 的位置。
有没有办法在 cfc 页面中的 Delete 语句(使用 sql server)中从多个表中删除?
当我进行初始删除时,我尝试写一个<cfif>,以检查是否有记录被删除,如果有,则运行下一个从表中删除设备的删除语句。
我也尝试过使用这种格式。
delete T1, T2
from T1
inner join T2 on T1.device_id = T2.device_id
where T2.device_id = '111';
T1 = 设备表,T2 = 位置表
<cfif ARGUMENTS.submitButton eq 'btn_Delete'>
<cfquery name="DeleteDevice" datasource="#session.dsn#" maxRows=1 >
DELETE from #session.tq#device
WHERE device_id = <cfqueryparam value="#formStruct.deviceId#" cfsqltype="CF_SQL_VARCHAR">
</cfquery>
</cfif>
<cfif DeleteDevice.RecordCount eq 1>
<cfquery name="DeleteLocation" datasource="#session.dsn#" maxRows=1 >
DELETE from #session.tq#device_location_xref
WHERE device_location_xref_recno=<cfqueryparam value="#formStruct.deviceId#" cfsqltype="CF_SQL_VARCHAR">
</cfquery>
【问题讨论】:
-
您可以在数据库中为子表添加级联删除。另外,请注意
#session.tq#。如果您不使用或进行其他验证,您的查询很容易被利用。 -
你是说不起作用的代码是
<cfif DeleteDevice.RecordCount eq 1>条件吗?如果是这样,请尝试将result=variablename添加到您的初始<cfquery name="DeleteDevice" datasource="#session.dsn#" maxRows=1 >语句中。然后使用该变量名检查RecordCount。 -
如果
device_location_xref到device有外键约束,那么你必须先从第二个表中删除。无论如何,总是做第二次删除,然后是第一次。如果没有链接记录,则不会删除任何内容,您可以继续。另外,您的表格是否以session.tq...something命名?这似乎会成为一场数据噩梦。 -
我一直发现使用
void标记记录比实际删除记录要好得多。如果有人不小心删除了错误的记录,将void设置为 false 比从备份中恢复要容易得多。 -
(编辑)有没有办法在 Delete 语句中从多个表中删除 不可以。SQL Server 一次只允许从一个表中删除。您的
cfif代码不起作用的原因是因为 DELETE 语句不返回“查询”对象 - 用 CF 的说法。要确定受影响的记录数,您需要使用 cfquery"result"属性,如 Miguel-F 所述。说了这么多,为什么重要?正如 Shawn 所描述的,您可以先从 secondary 表中删除任何记录,然后再从主表中删除,然后就完成了。 (续)
标签: sql-server tsql coldfusion