日期:2014-05-17  浏览次数:20376 次

请问怎么更新有外键的两个表?
表tb_A (nIndex,szNumber,...)
表tb_B (nIndex,szNumber,...)
其中只有szNumber是外键关联的,但都不是两者的主键哈!主键是nIndex,自增长的。
希望完成这样的功能,同时删除或插入一条信息到两个表中。
insert into tb_A(szNumber) values('03895678')
insert into tb_B(szNumber) values('03895678')
单独执行不可以,提示有约束冲突,怎么能合并成一条语句呢?

希望不要用存储过程,因为我是要在C++里面调用的......

------解决方案--------------------
#1.报什么错?是因为你没往主表添加主键记录吧:03895678
#2.2个INSERT不可能写成一个SQL,只能放到一个事务里,作为一个整体。
BEGIN TRAN
insert into tb_A(szNumber) values('03895678')
insert into tb_B(szNumber) values('03895678')
COMMIT TRAN
#3.没自动修复功能。自己写SQL查询处理。
INSERT INTO tb1
(
field1,field2
)
SELECT field1,field2 FROM tb2 b
WHERE not EXISTS
(
SELECT 1
FROM tb2 a
WHERE a.szNumber = b.szNumber
)

INSERT INTO tb2
(
field1,field2
)
SELECT field1,field2 FROM tb1 a
WHERE not EXISTS
(
SELECT 1
FROM tb2 b
WHERE a.szNumber = b.szNumber
)

------解决方案--------------------

begin tran
alter table tab_A nocheck constraint fk;
insert into tb_A(szNumber) values('03895678')
insert into tb_B(szNumber) values('03895678')
alter table tab_B check constraint fk
commit tran

把fk换成你表的外键名。
------解决方案--------------------
如果没有级联更新或删除的话,删除时须删除子表的再删除主表的
如果有级联则只更新或删除主表其了表记录会自动相应地更新或删除