Sql 在避免外键冲突的同时更新两个表
基本上,我有两张表:Sql 在避免外键冲突的同时更新两个表,sql,sql-server,visual-studio-2010,vb.net-2010,Sql,Sql Server,Visual Studio 2010,Vb.net 2010,基本上,我有两张表: 项目主控-srno(主键)、名称(唯一键) 销售记录-票据编号(主键)、名称(项目主控键的外键) 现在,如果我想更新ITEM_MASTER中的名称,外键将发生冲突。 我所做的是: //adding a new record with new name INSERT INTO ITEM_MASTER VALUES('srno * -1', new_name) //update sell record with new name UPDATE SELL_RECORD SET
//adding a new record with new name
INSERT INTO ITEM_MASTER VALUES('srno * -1', new_name)
//update sell record with new name
UPDATE SELL_RECORD SET name = 'new_name' WHERE name = 'old_name'
//deleted the record with old name
DELETE FROM ITEM_MASTER WHERE name = 'old_name'
//restored the original srno
UPDATE ITEM_MASTER SET srno = 'srno * -1' WHERE name = 'new_name'
这东西起作用了。我想问的是,有没有简单的方法?
例如,我可以做:
UPDATE ITEM_MASTER, SELL_RECORD SET
ITEM_MASTER.name = 'new_name',
SELL_RECORD.name = 'new_name'
WHERE SELL_RECORD.name = 'old_name' AND ITEM_MASTER.name = 'old_name' AND ITEM_MASTER.name = SELL_RECORD.name
像这样的?
提前谢谢 你可以试试这个:
Create table ITEM_MASTER
(
smo varchar(20) Primary key,
name varchar(20) Unique
)
Create table SELL_RECORD
(
bill_no varchar(20) Primary key,
name varchar(20) FOREIGN KEY REFERENCES ITEM_MASTER(name) on update cascade
)
Update ITEM_MASTER set name='new_name' where name='old_name'
您的子表SELL_记录将得到更新。如果您只需在引用
srno
(主键)的位置执行适当的外键,您可以随意更新name
(不违反唯一约束)。您不能在sql server中的一个更新查询中更新两个表。因此,您不能在单个更新查询中更新ITEM_MASTER和SELL_记录。因此,我使用的方法最终是唯一的方法,对吗@Manishmawatwall为什么不尝试级联效应来更新子表和父表。e、 你可以用“。。。外键引用了“更新级联”中的项_MASTER(名称)。这将节省您编写单独的更新和删除查询。您这样做的方式很好。想不出比这更简单的了。另外,第一个查询插入新记录,最后一个查询似乎会更新它,但这不是必需的,因为在我看来,liek它不会改变任何东西。@MichałTurczyn第一个查询插入一个srno为负的记录,最后一个查询在删除原始记录后将srno更改为正的记录。在Visual Studio 2010中,我如何做到这一点?我正在windows窗体应用程序中使用vb.net。@Pratik Bhavsar,需要在vb.net中进行验证。如果要将引用行的父表更新为子表,则可以在SQL SERVER中使用cascade修改外键关系,并尝试从vb.net更新ITEM_主表。