線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1303
推到 Plurk!
推到 Facebook!

触发器中删除问题(SQL关联表)

答題得分者是:timhuang
baby2321
初階會員


發表:52
回覆:165
積分:48
註冊:2005-06-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-25 21:11:05 IP:219.139.xxx.xxx 未訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-25 22:04:52 IP:220.132.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-27 15:28:08 IP:219.140.xxx.xxx 未訂閱
多谢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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-27 18:53:09 IP:203.95.xxx.xxx 未訂閱
兩表關連指的就是 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-29 15:48:30 IP:219.140.xxx.xxx 未訂閱
非常抱歉 晚了一天回复 timhuang 真是大牛 你告之的两种方法皆可实现 前者是在把所有与表A关联的表的关联关系全部去掉时 即可实现 后者需将所有与表A关联的表的级联删除全部设定 即可实现 我原以为解决了表A和表B的关系 即可解决其他 也正是这使我没将问题说清楚 表A 是 核心表 它除了和表B关联 也和其他各表通过 代码 关联 在下惭愧
baby2321
初階會員


發表:52
回覆:165
積分:48
註冊:2005-06-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-07-29 15:51:53 IP:219.140.xxx.xxx 未訂閱
再次感谢 timhuang
系統時間:2024-06-08 8:58:02
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!