插入或更新存储过程

时间:2016-02-24 18:09:50

标签: mysql database stored-procedures

我创建了一个存储过程来插入或更新数据库中的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",table" dbo.dp"。

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

1 个答案:

答案 0 :(得分:0)

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

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

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

另外,您的更新存在缺陷,因为它会根据连接而不是从现有数据更改的任何内容更新表的每个记录。根据记录的数量,可能会出现性能问题。不必要地更新十个记录,没什么大不了的,更新10,000,000个?可能是个问题。