【问题标题】:SQL insert into values where not existsSQL 插入不存在的值
【发布时间】:2012-10-30 13:47:12
【问题描述】:

我正在尝试执行以下查询

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

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

【问题讨论】:

  • 报错...什么错误?
  • #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法,以便在第 1 行的“不存在的地方(从 test where trans_id = 1 中选择 trans_id、ledger_code_1 和”附近)使用正确的语法
  • 因为INSERT 语句不能有WHERE 子句,除非它是INSERT INTO...SELECT 语句

标签: mysql sql


【解决方案1】:

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'
)

【讨论】:

  • 你需要在外部语句中添加一个'from'子句
  • @JanDvorak 这是不正确的。未选择任何表格列。见example
  • select 不需要from,但select ... where 需要from。见这里:sqlfiddle.com/#!2/d41d8/3224
  • @RedFilter 别担心,我以前也是这么想的……直到我自己尝试使用它。
  • @JanDvorak 我已经有 10 年没有使用 MySQL 了。可能不应该回答这些问题:)
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:
      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'     
          )
    

    【讨论】:

    • trans_id,ledger_code_1 的值在 insert 中是相同的,在不存在的地方只有这样
    • 您需要在外部语句中添加一个 'from' 子句 - 请参阅另一个答案。
    猜你喜欢
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 2018-09-17
    • 2014-01-25
    • 2019-07-13
    相关资源
    最近更新 更多