触发器中删除问题(SQL关联表) |
答題得分者是:timhuang
|
baby2321
初階會員 發表:52 回覆:165 積分:48 註冊:2005-06-11 發送簡訊給我 |
SQL SERVER2000中
表A 代码(主键) 名称 类别
表B 代码(主键) 名称 数额 表B通过 代码 和表A关联 现在表A上建触发器 create trigger 删除触发 on 表A for delete as begin update 表B set 代码=deleted.代码,名称=deleted.名称,数额=0 from 表B,deleted where 表B.代码=deleted.代码 end 测试通过 但在应用程序中删除 表A中记录时 提示"delete语句与column reference约束'表B_代码'冲突。该冲突发生于数据库'我建的数据库XX','column','代码'" 个人想法: 我想通过触发器实现 表A删除记录 表B自动调整 INSERT UPDATE都可以实现 没有异常 就是DELETE不行(以前听人说主从表的数据只能先删除从表再删除主表 表A和表B是主从表吗???我认为他们是关联关系) 多谢各位
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
Hi, 所謂 master / detail 的概念, 其實是透過一個 foreign key 來實現的, 例如:
表 A order
orderid / orderdate 表 B orderdetail
orderid / seqno / productid / quantity 我們利用表 B 的 orderid 將 表 A 的 orderid 與之關連, 也就是將 表 B 的 orderid foreign key reference to 表 A 的 orderid, 代表著表 B 的 orderid 必需在表 A 中存在, 因此, 若表 B 有一筆 orderid=3 代表 表 A 也有一筆 orderid=3 的資料, 但在表 B 該筆資料未刪除前, 表 A 的 orderid=3這筆資料因為有表B的參考存在, 而無法刪除, 如同你看見的錯誤訊息. 所以請你確認一下該二表間的關連狀況即可得知!
|
baby2321
初階會員 發表:52 回覆:165 積分:48 註冊:2005-06-11 發送簡訊給我 |
多谢timhuang
你说的两表间的 关联状况 指的什么?
我这里仅仅就是把表A 的主键 和表B的主键 都设为了 代码
现在希望实现在表A删除一条记录时 同时删除表B的对应记录(鉴于新增和更新功能我都是用触发器实现 所以希望删除也能通过触发器实现) 这两天我也看了一些其他论坛对这一部分的讨论 发现有
1.
CREATE TRIGGER 删除 ON 表A
for delete as
declare @ID char(10)
select @ID=代码 from deleted
delete from 表B where 代码=@id
这种方式分析时可以通过即在SQL SERVER2000中没有问题 但在应用时 我删除表A中的记录 却仍然提示delete语句与column reference约束的错误 且删除无效果 2.也有朋友说 通过加一个事件, 删除主表时 删除从表在主表的beforedelete事件中 先查找从表的相关纪录删除
如:
CREATE TRIGGER 触发器名 FOR 主库名 BEFORE DELETE POSITION 0 AS
BEGIN
DELETE FROM 从库 where 从库.id=主库.id
end 但我在测试时
CREATE TRIGGER 删除 FOR 表A BEFORE DELETE POSITION 0 AS
BEGIN
DELETE FROM 表B where 表B.id=表A.id
end
提示:关键字FOR附近有语法错误 故将其改为ON;又提示在POSITION附近有问题 我将POSITION 0 删除 又提示 BEFORE 不对 我已经...... 真诚请教 再次感谢timhuang
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
兩表關連指的就是 foreign key constraint 啊. 就是外部鍵參考. 依你的狀況看來, 應該是表 b 代碼要參考表 a 的代碼, 而在刪除表 a 資料時, 先刪除表 b 的資料應該是沒有問題的, 只是你一次可能刪去多筆, 所以要稍為改一下, 請修正為:
CREATE TRIGGER del_tbl_a ON 表A for delete as delete 表B from 表B b inner join deleted d on b.代碼=d.代碼另外亦可由修改 foreign key 為 ON DELETE CASCADE 讓刪除表 a 資料時, 一併刪除表 b 的對應資料!! |
baby2321
初階會員 發表:52 回覆:165 積分:48 註冊:2005-06-11 發送簡訊給我 |
|
baby2321
初階會員 發表:52 回覆:165 積分:48 註冊:2005-06-11 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |