1

我正在尝试执行以下查询

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 where **trans_id = 1 and' 在第 1 行选择 trans_id,ledger_code_1

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

4

3 回答 3

5

请参阅插入...选择语法

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'
)
于 2012-10-30T13:50:28.187 回答
3

您可能会考虑另一种方法。

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

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

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

缺点(除了必须捕获异常之外)是它仅在您 100%、从不、永远想要允许这些重复记录时才有效。如果您偶尔会这样做(例如,trans_id 1 是真的,但 trans_id 999 不是),那么您将无法在应用程序代码中应用完整性检查。

于 2012-10-30T14:04:14.500 回答
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'     
      )
于 2012-10-30T13:54:26.293 回答