我正在尝试执行以下查询
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行
还有其他解决方案吗?我有主键作为自动号..
答案 0 :(得分: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'
)
答案 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'
)