Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在避免外键冲突的同时更新两个表_Sql_Sql Server_Visual Studio 2010_Vb.net 2010 - Fatal编程技术网

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

基本上,我有两张表:

  • 项目主控-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 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_主表。