怎么写SQL语句的删除?(30分)

  • 主题发起人 主题发起人 alaska_shi
  • 开始时间 开始时间
A

alaska_shi

Unregistered / Unconfirmed
GUEST, unregistred user!
我要维护一个一对多的数据库,当删除主表的一条记录时,将附表中对应的
记录删除,我知道SQl的写法是
delete table_name where field=field_value
可在Delphi中这句话应该写在那儿?
 
如果是用一个TQUERY控件则
可以这样写
query1.Sql.Text:='delete table_name where field=:value';
Query1.ParamsByname('value'):=...
Query1.ExecSQL;
OK!!
 
搞定!谢谢
不过为什么在程序中发现是删除了,但出来用Database Desktop一看还在?
 
Delphi 用了缓存技术,成需要关闭才能真正删除,但是如果你用了
DataBase控件并且提交的话也真正删除了.
 
如果是 interbase. Sql server 等大型数据库,这种操作最好在数据库中进行,在主表中加一个Before Delete Trigger:
Delete from subTable where subKey1 = key1
如果在dbase/paradox 数据库中,则需要在 Delphi 中编程实现, 在主表记录删除前后,用一个 Query 实现子表的删除:
...DeleteQuery.ExecSql
就可以了
 
简单的说,是不是我无须管这个问题?只要没有断电之类的事情发生,一切均正常?
 
>>在主表记录删除前后
crab,
前or 后?
 
我看应该是先删从表,再删主表。
 
同意Crab的做法,SQL Server的语法是这样的,
CREATE TRIGGER Tr_Delete On Table1
FOR DELETE
AS
DELETE TABLE2 FROM TABLE2 T, deleted d
WHERE T.Key = d.Key
GO
如果使用这种方法实现,不需要管了,SQL Server会控制整个事务的提交和回滚.

dbase/paradox , 正如 skyrabbit 所述, 在主表的 BeforeDelete 事件中处理,
(万一: 从表数据删除了, 在删除主表时却出错了...???!!!)
 
最好用Transaction
在写了sql语句后。
Database1.StartTransaction;
try
begin
query.exesql;
table.post;
Database1.Commit;
end
except
begin
Database1.Rollback;
application.messagebox('储存失败,请确定后再试一次!','',64);
exit;
end;
end;
 
用触发器吧
 
1、可以写在主表的beforedelete事件中
2、如果是大型数据库如sql server 可以写在数据库上,用触发器。
3、在客户端启动事务。
 
接受答案了.
 
后退
顶部