日期:2014-05-16  浏览次数:20725 次

SQL触发器 自动更新子表
主表:订单表 Order
  orderID、 date 、 N (orderID为主键)
  1 2010-01-23 .
  2 2010-01-24 .
  3 2010-01-25 .
  4 2010-01-26 .
  5 2010-01-27 .
子表:订单明细表OrderDetail
  orderID、 材料编号、数量、单价
  1 ZL001 23 23.2
  1 ZL001 23 23.2
  2 ZL001 23 23.2
  2 ZL001 23 23.2
  3 ZL001 27 23.1
  4 ZL001 12 23.2
  4 ZL001 3 23.0
  4 ZL001 23 23.2
想实现:当我更新主表中的orderID后,子表订单明细表的 orderID也跟着修改。

我自己写了触发器,但有问题更新主表的orderID后,单明细表的 orderID没有跟着修改

create trigger Order_Trigger on Order
for update
as 
begin
set nocount on
  declare @id int
  select @id=Orderid from inserted
begin
update OrderDetail set Orderid=@id where Orderid=(select Orderid from inserted)
  end
end

恳求各位大虾帮忙,指点错误在那? 或有其他更好的方法来实现

------解决方案--------------------
方案一,直接修改表的约束为外键约束。这样当主表中的主键变化后,子表中会自动更新。

引用
13.6.4.4. FOREIGN KEY Constraints
InnoDB supports foreign key constraints. The syntax for a foreign key constraint definition in InnoDB looks like this:

[CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name, ...)
REFERENCES tbl_name (index_col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]

reference_option:
RESTRICT | CASCADE | SET NULL | NO ACTION



------解决方案--------------------
方法二,使用触发器。

SQL code
delimiter |

CREATE TRIGGER Order_Trigger AFTER UPDATE ON `Order`
  FOR EACH ROW BEGIN
    UPDATE OrderDetail SET  Orderid=NEW.Orderid WHERE Orderid=OLD.Orderid ;
  END;
|

delimiter ;

------解决方案--------------------
where current of cur_bbb
这句没看明白啊
------解决方案--------------------
orderID不应该修改的。主键无需修改。你担心数字上限?
------解决方案--------------------
简答的问题复杂化?