【问题标题】:How to check for matching in SQLite in order to insert new data or update them?如何在 SQLite 中检查匹配以插入新数据或更新它们?
【发布时间】:2021-09-19 05:31:15
【问题描述】:

如果不存在列 EqpCode 的匹配值,我想将数据插入表中。如果有任何匹配项,我想更新该行。 我使用了这个查询,但它在 WHERE 附近有语法错误:

INSERT INTO FileInfo(EqpCode, EqpName, FileName) VALUES ('123', 'test01', 'test02') 
WHERE NOT EXISTS (SELECT 1 FROM FileInfo WHERE EqpCode='123')

【问题讨论】:

  • EqpCode 是 PRIMARY KEY 还是定义为 UNIQUE?
  • 不,我将它们定义为 VARCHAR
  • 您不希望 EqpCode 是唯一的吗?
  • 是的,我想让它独一无二。
  • 我应该使用哪种 SQL 类型?唯一标识符?

标签: sqlite sql-update sql-insert unique-constraint upsert


【解决方案1】:

首先,您必须将列 EqpCode 定义为 UNIQUE(如果表中没有,则定义为 PRIMARY KEY):

CREATE TABLE FileInfo(
  id INTEGER PRIMARY KEY,
  EqpCode TEXT UNIQUE, 
  EqpName TEXT, 
  FileName TEXT
);

然后使用SQLite的UPSERT:

INSERT INTO FileInfo(EqpCode, EqpName, FileName) VALUES ('123', 'test01', 'test02')
ON CONFLICT(EqpCode) DO UPDATE 
SET EqpName = EXCLUDED.EqpName,
    FileName = EXCLUDED.FileName;

这样,只有在表中不存在'123' 时才会插入新行。
如果确实存在,则将使用提供的 EqpNameFileName 值更新该行。

请参阅demo

【讨论】:

  • 谢谢。有用。我学到了一些新东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
  • 2013-02-23
  • 1970-01-01
相关资源
最近更新 更多