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サーバーのバージョンに対応するマニュアルで、存在しない場所の近くで使用する正しい構文を確認してください(** trans_id =1のテストからtrans_id、ledger_code_1を選択し、1行目で'

他に解決策はありますか?私は自動番号として主キーを持っています。

4

3 に答える 3

5

INSERT ... SELECT構文を参照してください:

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値を持つ2つのステートメントの存在を回避しようとしているように見えます。それが問題の正しい記述である場合は、これらの2つの列をUNIQUEインデックスで保護する必要があります(または、適切な場合は、それらをテーブルの主キーにすることを検討してください)。

これを行うと、重複挿入を回避するためのロジックを気にすることなく、INSERTステートメントを発行できます。レコードがすでに存在する場合は、例外をトラップする必要があります。

このアプローチの利点は、将来追加のSQLを記述して条件を含めるのを忘れた場合や、テーブルのデータを直接変更した場合でも、これら2つの列のデータ整合性に違反しないことが保証されることです。

欠点(例外をトラップする必要があることを除けば)は、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 に答える