【问题标题】:Insert or replace doesn't work插入或替换不起作用
【发布时间】:2014-03-21 16:04:31
【问题描述】:

我需要在现有数据库中插入或替换,但它无法正常工作。

示例:

select * from tab where name = 'foo';
6530|foo|ok|||
insert or replace into tab values('foo', 'ok', 1, 2, 3);
select * from tab where name = 'foo';
6530|foo|ok|||
43523|foo|ok|1|2|3

为什么插入替换不会将现有字段“更新”到记录 6530 中而是创建一个新字段?

桌子:

create table tab(
    id integer unique primary key,
    name text not null,
    tipo text not null,
    val1 integer,
    val2 integer,
    val3 integer
);

【问题讨论】:

  • 你的问题是什么插入或更新,因为你的查询太错误了,......所以,首先你应该清楚发布你的问题......

标签: sqlite sql-insert


【解决方案1】:

您需要在一个或多个列上具有唯一索引,例如:

CREATE UNIQUE INDEX idx_tab ON tab (name, tipo);

当表中存在相同的值时,记录将被删除并插入新值。您可以使用以下内容进行 UPSERT:

INSERT OR REPLACE INTO tab (id, name, tipo, val1, val2, val3)
 SELECT old.id, new.name, new.tipo, new.val1, new.val2, val3
 FROM ( SELECT
     'foo' AS name,
     'ok' AS tipo,
     1  AS val1,
     2  AS val2,
     3  AS val3
 ) AS new
 LEFT JOIN (
     SELECT id, name, tipo, val1, val2, val3
     FROM tab
 ) AS old ON new.name= old.name;

【讨论】:

    【解决方案2】:

    插入或更新命令利用定义的唯一键工作。在 Ins 或 Upd 之后有 2 个不同行的原因是因为您没有传递引擎执行更新所需的唯一 ID,而是(因为缺少 ID)正在执行插入。 查询后:

    select * from tab where name = 'foo';
    

    执行:

    insert or replace into tab values(ID, foo', 'ok', 1, 2, 3);
    

    而 ID 是从上一个查询中获得的 ID(即 6530)

    现在该行将被更新。

    【讨论】:

      【解决方案3】:

      示例:插入或替换不起作用

      假设表中有 3 列.. ID、NAME、ROLE

      错误:这将插入或替换所有列的 ID=1 的新值:

      INSERT OR REPLACE INTO Employee (id, name, role) 
        VALUES (1, 'John Foo', 'CEO');
      

      错误:这将插入或替换 2 个列... NAME 列将设置为 NULL 或默认值:

      INSERT OR REPLACE INTO Employee (id, role) 
        VALUES (1, 'code monkey');
      

      GOOD:这将更新 2 列。当 ID=1 存在时,NAME 将不受影响。当 ID=1 不存在时,名称为默认(NULL)。

      INSERT OR REPLACE INTO Employee (id, role, name) 
        VALUES (  1, 
                  'code monkey',
                  (SELECT name FROM Employee WHERE id = 1)
                );
      

      这将更新 2 列。当 ID=1 存在时,ROLE 不受影响。当 ID=1 不存在时,角色将被设置为 'Benchwarmer' 而不是默认值。

      INSERT OR REPLACE INTO Employee (id, name, role) 
        VALUES (  1, 
                  'Susan Bar',
                  COALESCE((SELECT role FROM Employee WHERE id = 1), 'Benchwarmer')
                );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-08
        • 2015-05-11
        • 1970-01-01
        • 2014-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多