C# 如何跳过唯一约束冲突
如果我将批量插入作为事务的一部分,如下所示:C# 如何跳过唯一约束冲突,c#,asp.net,transactions,informix,unique-constraint,C#,Asp.net,Transactions,Informix,Unique Constraint,如果我将批量插入作为事务的一部分,如下所示: cmdTxt.Clear(); cmdTxt.Append(" INSERT INTO sc1pen "); cmdTxt.Append(" SELECT action_month,action_year,200,emp_num,penalty_action , "); cmdTxt.Append(" 'APPLY ' || penalty_reason || ' day ' , 0 , 0 "); cmdTxt.Append(" FROM sc
cmdTxt.Clear();
cmdTxt.Append(" INSERT INTO sc1pen ");
cmdTxt.Append(" SELECT action_month,action_year,200,emp_num,penalty_action , ");
cmdTxt.Append(" 'APPLY ' || penalty_reason || ' day ' , 0 , 0 ");
cmdTxt.Append(" FROM sc2pen WHERE sal_year = ? and sal_month = ? and penalty_type = 1 and pay_type = 0 ");
myIfxCmd.CommandText = cmdTxt.ToString();
myIfxCmd.Parameters.Clear();
myIfxCmd.Parameters.Add("sal_year", IfxType.Integer);
myIfxCmd.Parameters.Add("sal_month", IfxType.Integer);
myIfxCmd.Parameters[0].Value = penaltyDt.Rows[0]["sal_year"];
myIfxCmd.Parameters[1].Value = penaltyDt.Rows[0]["sal_month"];
myIfxCmd.ExecuteNonQuery();
如果在插入过程中违反了
唯一约束
如何避免回滚整个事务,我希望跳过导致此唯一约束异常的行并继续插入过程。很难猜测问题中两个表的模式是什么,但是我们可以做一些猜测,并根据这些猜测测试代码
半似然图式
INSERT语句的翻译
这是问题的INSERT语句的翻译
INSERT INTO sc1pen
SELECT action_month, action_year, 200 AS unidentified_1, emp_num, penalty_action,
'APPLY ' || penalty_reason || ' day ' AS penalty_string,
0 AS unidentified_2, 0 AS unidentified_3
FROM sc2pen
WHERE sal_year = 2016 AND sal_month = 4 AND penalty_type = 1 AND pay_type = 0;
由于我使用的是命令行工具,而不是嵌入式SQL或类似工具,因此我必须将问号替换为值-2016表示sal_年
,4表示sal_月
可能的合并语句
这主要是“阅读手册”上的声明
关于的
子句似乎是似是而非的;由于表中没有主键的标识,所以我们必须猜测连接条件应该是什么。您可以修改INSERT语句,以确保不插入违反该约束的项。请参阅此帖子:您可以考虑该语句。“不匹配时插入”选项可能是与您相关的选项。@JonathanLeffler您能用您的语法在问题中写下我的查询吗。
INSERT INTO sc1pen
SELECT action_month, action_year, 200 AS unidentified_1, emp_num, penalty_action,
'APPLY ' || penalty_reason || ' day ' AS penalty_string,
0 AS unidentified_2, 0 AS unidentified_3
FROM sc2pen
WHERE sal_year = 2016 AND sal_month = 4 AND penalty_type = 1 AND pay_type = 0;
MERGE INTO sc1pen AS dst
USING (
SELECT action_month, action_year, 200 AS unidentified_1, emp_num, penalty_action,
'APPLY ' || penalty_reason || ' day ' AS penalty_string,
0 AS unidentified_2, 0 AS unidentified_3
FROM sc2pen
WHERE sal_year = 2016 AND sal_month = 4 AND penalty_type = 1 AND pay_type = 0
) AS src
ON dst.action_month = src.action_month AND
dst.action_year = src.action_year AND
dst.emp_num = src.emp_num
WHEN NOT MATCHED THEN INSERT VALUES(src.action_month, src.action_year,
src.unidentified_1, src.emp_num, src.penalty_action,
src.penalty_string, src.unidentified_2, src.unidentified_3)
;