关于两张相关联的表,对一张表实施插入删除,怎样更新另外一张表的数据

时间:2022-05-03 00:47:49
同一个字段在一张表中是主键在另外一张表中是外键,怎样在更新表时也想相应更新另外一张表

5 个解决方案

#1


on update cascade

#2


有一个关键字可以使用,不过好像是2008才能用:merge


根据与源表联接的结果,对目标表执行插入、更新或删除操作。
例如,根据在另一个表中找到的差异在一个表中插入、更新或删除行,可以对两个表进行同步。



Transact-SQL 语法约定

语法
--------------------------------------------------------------------------------

以带有颜色区分的格式查看复制到剪贴板打印  [ WITH <common_table_expression> [,...n] ]
  MERGE 
      [ TOP ( expression ) [ PERCENT ] ] 
      [ INTO ] <target_table> [ WITH ( <merge_hint> ) ] [ [ AS ] table_alias ]
      USING <table_source> 
      ON <merge_search_condition>
      [ WHEN MATCHED [ AND <clause_search_condition> ]
          THEN <merge_matched> ] [ ...n ]
      [ WHEN NOT MATCHED [ BY TARGET ] [ AND <clause_search_condition> ]
          THEN <merge_not_matched> ]
      [ WHEN NOT MATCHED BY SOURCE [ AND <clause_search_condition> ]
          THEN <merge_matched> ] [ ...n ]
      [ <output_clause> ]
      [ OPTION ( <query_hint> [ ,...n ] ) ]    
  ;
  
  <target_table> ::=
  { 
      [ database_name . schema_name . | schema_name . ]
    target_table
  }
  
  <merge_hint>::=
  {
      { [ <table_hint_limited> [ ,...n ] ]
      [ [ , ] INDEX ( index_val [ ,...n ] ) ] }
  }
  
  <table_source> ::= 
  {
      table_or_view_name [ [ AS ] table_alias ] [ <tablesample_clause> ] 
          [ WITH ( table_hint [ [ , ]...n ] ) ] 
    | rowset_function [ [ AS ] table_alias ] 
          [ ( bulk_column_alias [ ,...n ] ) ] 
    | user_defined_function [ [ AS ] table_alias ]
    | OPENXML <openxml_clause> 
    | derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ] 
    | <joined_table> 
    | <pivoted_table> 
    | <unpivoted_table> 
  }
  
  <merge_search_condition> ::=
      <search_condition>
  
  <merge_matched>::=
      { UPDATE SET <set_clause> | DELETE }
  
  <set_clause>::=
  SET
    { column_name = { expression | DEFAULT | NULL }
    | { udt_column_name.{ { property_name = expression
                          | field_name = expression }
                          | method_name ( argument [ ,...n ] ) }
      }
    | column_name { .WRITE ( expression , @Offset , @Length ) }
    | @variable = expression
    | @variable = column = expression
    | column_name { += | -= | *= | /= | %= | &= | ^= | |= } expression
    | @variable { += | -= | *= | /= | %= | &= | ^= | |= } expression
    | @variable = column { += | -= | *= | /= | %= | &= | ^= | |= } expression
    } [ ,...n ] 
  
  <merge_not_matched>::=
  {
      INSERT [ ( column_list ) ] 
          { VALUES ( values_list )
          | DEFAULT VALUES }
  }
  
  <clause_search_condition> ::=
      <search_condition>
  
  <search condition> ::=
      { [ NOT ] <predicate> | ( <search_condition> ) } 
      [ { AND | OR } [ NOT ] { <predicate> | ( <search_condition> ) } ] 
  [ ,...n ] 
  
  <predicate> ::= 
      { expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } expression 
      | string_expression [ NOT ] LIKE string_expression 
    [ ESCAPE 'escape_character' ] 
      | expression [ NOT ] BETWEEN expression AND expression 
      | expression IS [ NOT ] NULL 
      | CONTAINS 
    ( { column | * } , '< contains_search_condition >' ) 
      | FREETEXT ( { column | * } , 'freetext_string' ) 
      | expression [ NOT ] IN ( subquery | expression [ ,...n ] ) 
      | expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } 
    { ALL | SOME | ANY} ( subquery ) 
      | EXISTS ( subquery ) } 
  
  <output_clause>::=
  {
      [ OUTPUT <dml_select_list> INTO { @table_variable | output_table }
          [ (column_list) ] ]
      [ OUTPUT <dml_select_list> ]
  }
  
  <dml_select_list>::=
      { <column_name> | scalar_expression } 
          [ [AS] column_alias_identifier ] [ ,...n ]
  
  <column_name> ::=
      { DELETED | INSERTED | from_table_name } . { * | column_name }
      | $action
  
详细请看联机丛书,应该就能解决你的问题

#3


建一个级联就行了

#4


可以考虑触发器

#5


该回复于2012-06-13 14:57:17被版主删除

#1


on update cascade

#2


有一个关键字可以使用,不过好像是2008才能用:merge


根据与源表联接的结果,对目标表执行插入、更新或删除操作。
例如,根据在另一个表中找到的差异在一个表中插入、更新或删除行,可以对两个表进行同步。



Transact-SQL 语法约定

语法
--------------------------------------------------------------------------------

以带有颜色区分的格式查看复制到剪贴板打印  [ WITH <common_table_expression> [,...n] ]
  MERGE 
      [ TOP ( expression ) [ PERCENT ] ] 
      [ INTO ] <target_table> [ WITH ( <merge_hint> ) ] [ [ AS ] table_alias ]
      USING <table_source> 
      ON <merge_search_condition>
      [ WHEN MATCHED [ AND <clause_search_condition> ]
          THEN <merge_matched> ] [ ...n ]
      [ WHEN NOT MATCHED [ BY TARGET ] [ AND <clause_search_condition> ]
          THEN <merge_not_matched> ]
      [ WHEN NOT MATCHED BY SOURCE [ AND <clause_search_condition> ]
          THEN <merge_matched> ] [ ...n ]
      [ <output_clause> ]
      [ OPTION ( <query_hint> [ ,...n ] ) ]    
  ;
  
  <target_table> ::=
  { 
      [ database_name . schema_name . | schema_name . ]
    target_table
  }
  
  <merge_hint>::=
  {
      { [ <table_hint_limited> [ ,...n ] ]
      [ [ , ] INDEX ( index_val [ ,...n ] ) ] }
  }
  
  <table_source> ::= 
  {
      table_or_view_name [ [ AS ] table_alias ] [ <tablesample_clause> ] 
          [ WITH ( table_hint [ [ , ]...n ] ) ] 
    | rowset_function [ [ AS ] table_alias ] 
          [ ( bulk_column_alias [ ,...n ] ) ] 
    | user_defined_function [ [ AS ] table_alias ]
    | OPENXML <openxml_clause> 
    | derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ] 
    | <joined_table> 
    | <pivoted_table> 
    | <unpivoted_table> 
  }
  
  <merge_search_condition> ::=
      <search_condition>
  
  <merge_matched>::=
      { UPDATE SET <set_clause> | DELETE }
  
  <set_clause>::=
  SET
    { column_name = { expression | DEFAULT | NULL }
    | { udt_column_name.{ { property_name = expression
                          | field_name = expression }
                          | method_name ( argument [ ,...n ] ) }
      }
    | column_name { .WRITE ( expression , @Offset , @Length ) }
    | @variable = expression
    | @variable = column = expression
    | column_name { += | -= | *= | /= | %= | &= | ^= | |= } expression
    | @variable { += | -= | *= | /= | %= | &= | ^= | |= } expression
    | @variable = column { += | -= | *= | /= | %= | &= | ^= | |= } expression
    } [ ,...n ] 
  
  <merge_not_matched>::=
  {
      INSERT [ ( column_list ) ] 
          { VALUES ( values_list )
          | DEFAULT VALUES }
  }
  
  <clause_search_condition> ::=
      <search_condition>
  
  <search condition> ::=
      { [ NOT ] <predicate> | ( <search_condition> ) } 
      [ { AND | OR } [ NOT ] { <predicate> | ( <search_condition> ) } ] 
  [ ,...n ] 
  
  <predicate> ::= 
      { expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } expression 
      | string_expression [ NOT ] LIKE string_expression 
    [ ESCAPE 'escape_character' ] 
      | expression [ NOT ] BETWEEN expression AND expression 
      | expression IS [ NOT ] NULL 
      | CONTAINS 
    ( { column | * } , '< contains_search_condition >' ) 
      | FREETEXT ( { column | * } , 'freetext_string' ) 
      | expression [ NOT ] IN ( subquery | expression [ ,...n ] ) 
      | expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } 
    { ALL | SOME | ANY} ( subquery ) 
      | EXISTS ( subquery ) } 
  
  <output_clause>::=
  {
      [ OUTPUT <dml_select_list> INTO { @table_variable | output_table }
          [ (column_list) ] ]
      [ OUTPUT <dml_select_list> ]
  }
  
  <dml_select_list>::=
      { <column_name> | scalar_expression } 
          [ [AS] column_alias_identifier ] [ ,...n ]
  
  <column_name> ::=
      { DELETED | INSERTED | from_table_name } . { * | column_name }
      | $action
  
详细请看联机丛书,应该就能解决你的问题

#3


建一个级联就行了

#4


可以考虑触发器

#5


该回复于2012-06-13 14:57:17被版主删除