【问题标题】:Insert or Update Stored procedure插入或更新存储过程
【发布时间】:2016-02-24 18:09:49
【问题描述】:

我创建了一个存储过程来插入或更新数据库中的 em 表,例如

ALTER PROCEDURE [dbo].[uspInsertorUpdateArchibusINF]
@em_TT AS em_TT READONLY
AS
BEGIN
SET NOCOUNT ON;

BEGIN TRANSACTION;

  UPDATE e
     SET e.dp_id                 = t.dp_id,
         e.dv_id                 = t.dv_id,
         e.email                 = t.email,
         e.emergency_relation    = t.emergency_relation,
         e.name_first            = t.name_first,
         e.name_last             = t.name_last,
         e.option1               = t.option1,
         e.status                = t.status,
         e.em_title              = t.em_title,
         e.date_hired            = t.date_hired
    FROM [dbo].[em] e 
    INNER JOIN @em_TT t ON e.em_id = t.em_id

  INSERT INTO [dbo].[em](dp_id, dv_id, email, emergency_relation, name_first,name_last
                                    , option1, status, em_id, em_title,date_hired)
  SELECT t.dp_id, t.dv_id, t.email
        , t.emergency_relation,t.name_first,t.name_last, t.option1, t.status
        , t.em_id, t.em_title, t.date_hired
  FROM @em_TT t 
  WHERE NOT EXISTS (SELECT 1 
                    FROM [dbo].[em]
                    WHERE em_id = t.em_id)
COMMIT TRANSACTION;

END;

em 表中的 dp_id 和 dv_id 是表 dv 和 dp 的外键。所以现在我尝试在 em 表中插入一些新值,它会抛出类似的错误 INSERT 语句与 FOREIGN KEY 约束“em_dp_id”冲突。冲突发生在数据库“j20”、表“dbo.dp”中。

不,我不确定是否可以修改上述存储过程以插入是否有新的 dp_id 或 dv_id 到相应的表中。还是我必须单独创建它。非常感谢任何帮助

【问题讨论】:

    标签: mysql database stored-procedures


    【解决方案1】:

    如果您有执行插入所需的信息,您可以将插入添加到此存储过程中的另一个表中。如果该表有 12 个必填字段,而您只知道 id 的名称,那么不,您不能在这里做。但是,如果进入该表的所有内容都是 id 和开始日期,是的,你可以。您是否愿意是下面讨论的另一个问题。

    贵公司设置的业务规则将决定此时插入该表是否是一个好主意。您可能会遇到某些 id 不应该被您的应用程序支持的情况。 (例如,在我们的案例中,我们有时会支持客户的部分但不是全部销售人员。)在这种情况下,即使您拥有所需的所有数据,插入也是一个坏主意。可能此信息必须仅来自经批准的来源,然后此插入再次将是错误的位置。这些都是网上陌生人无法回答的问题,一定要咨询给你要求的人。

    另一种可能性是您在插入时加入到表中,这样您就不会收到错误消息。如果您不应该插入到父表中,这就是您想要做的。我个人建议使用一个异常表来实现这一点,在该表中我插入了那些无法插入的表,或者在它们被拒绝时让它们过滤给用户。这在很大程度上取决于您的整个系统是如何工作的,以及这些是来自用户还是文件导入。

    顺便说一句,您的更新存在缺陷,因为它根据联接更新表的每条记录,而不是根据现有数据更改的任何记录。根据记录的数量,这可能是一个性能问题。不必要地更新十条记录,没什么大不了的,更新 10,000,000 条?可能是个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-30
      • 2017-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-30
      • 1970-01-01
      相关资源
      最近更新 更多