SQL插入不存在的值

时间:2012-10-30 13:47:13

标签: mysql sql

我正在尝试执行以下查询

INSERT INTO test (trans_id, voucher_id, trans_date, ledger_code_1,
                  company_code,trans_type, trans_amount) 
VALUES (1, 1,'2012/04/01','2001', '8523a95b-5425-46be-89ed-ebd592846845',
        'Payment', -30)   
WHERE NOT EXISTS(SELECT trans_id, ledger_code_1 
                 FROM test 
                 WHERE trans_id = 1 AND ledger_code_1 = '2001')

给出错误。我哪里错了?

  

1064 - 您的SQL语法出错;检查手册   对应于您的MySQL服务器版本,以便使用正确的语法   在附近不存在(从test中选择trans_id,ledger_code_1)   ** trans_id = 1和'第1行

还有其他解决方案吗?我有主键作为自动号..

3 个答案:

答案 0 :(得分:5)

请参阅INSERT ... SELECT Syntax

INSERT INTO test         
(trans_id,voucher_id,trans_date,ledger_code_1,company_code,trans_type, Trans_amount)
SELECT 1, 1,'2012/04/01','2001', '8523a95b-5425-46be-89ed-ebd592846845', 'Payment', -30 
from test
where not exists(
    select 1
    from test 
    where trans_id = 1             
        and ledger_code_1 = '2001'
)

答案 1 :(得分:3)

您可能会考虑采用不同的方法。

从您的代码中可以看出,您试图避免使用具有相同trans_id和ledger_code_1值的两个语句。如果这是对您的问题的正确陈述,您应该使用UNIQUE索引保护这两列(或者如果合适,可以考虑将它们作为表的主键)。

如果这样做,您可以发出INSERT语句,而不必担心避免重复插入的逻辑。如果记录已存在,则必须捕获异常。

这种方法的优点是你保证永远不会违反这两列的数据完整性,即使你将来编写额外的SQL而忘记包含条件,或者如果你直接修改表中的数据。

缺点(除了必须捕获异常)是它只有在100%,永远不会想要允许那些重复记录的情况下才有效。如果你偶尔会遇到一个例子(例如,trans_id 1,而不是trans_id 999),那么你就会在应用程序代码中应用完整性检查。

答案 2 :(得分:0)

  INSERT INTO test         
  (trans_id,voucher_id,trans_date,ledger_code_1,company_code,trans_type, Trans_amount)
   SELECT 1, 1,'2012/04/01','2001', '8523a95b-5425-46be-89ed-ebd592846845',
  'Payment', -30 
   where not exists(
   select trans_id=1,ledger_code_1='2001'     
      )