我创建了一个存储过程来插入或更新数据库中的 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 到相应的表中。或者我必须单独创建它。非常感谢任何帮助
最佳答案
如果您拥有执行插入所需的信息,则可以将插入添加到此存储过程中的另一个表中。如果该表有 12 个必填字段,而您只知道 id 的名称,那么您不能在这里执行此操作。但是,如果该表中的所有内容都是 ID 和开始日期,那么可以。您是否愿意是下面讨论的另一个问题。
您公司设置的业务规则将决定此时插入该表是否是个好主意。您可能会遇到这样的情况:您的应用程序不应该支持某些 ID。 (例如,在我们的案例中,我们有时会支持客户的部分而非全部销售人员。)在这种情况下,即使您拥有所需的所有数据,插入也不是一个好主意。可能此信息必须仅来自经批准的来源,然后此插入内容将再次出现在错误的位置。这些是互联网上的陌生人无法回答的问题,你必须咨询给你提出要求的人。
另一种可能性是您在执行插入时加入表,这样就不会出现错误。如果您不应该插入到父表中,这就是您想要执行的操作。我个人建议使用异常表来实现此目的,在该异常表中插入无法插入的异常表,或者在它们被拒绝时将它们过滤给用户。这在很大程度上取决于整个系统的工作方式以及这些是否来自用户或文件导入。
顺便说一句,您的更新是有缺陷的,因为它根据联接更新表的每条记录,而不是根据现有数据更改任何记录。根据记录的数量,这可能是性能问题。不必要更新十条记录,没什么大不了的,更新一千万条?可能是个问题。
关于mysql - 插入或更新存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35609786/