使用新生成的id插入SQLite

时间:2013-08-22 15:58:50

标签: sql sqlite

我有一个包含自动增量字段的表格,另一个字段VARCHAR已归档。我想直接在insert查询中用新生成的id填充字符串字段。例如,使用表格:

Person
(
    id auto_increment, 
    name varchar
)

我想执行这样的查询:

INSERT INTO Person(name) VALUE ('Person #' + ROWID())

无论如何要做到这一点?

5 个答案:

答案 0 :(得分:2)

您不应该存储两次相同的信息。只需在查询时动态生成所需的字符串:

SELECT name || '#' || id FROM Person

答案 1 :(得分:2)

这将使用最后插入的行id,增量为1,以生成下一个人ID。 请注意,对于last_insert_rowid(),您不应该对数据库进行并发插入。

INSERT INTO Person (name) SELECT 'Person #' || (last_insert_rowid()+1);

或者,这将读取您当前拥有的最大ID并向其增加+1,然后将其与文本连接。如果返回null,则使用1。

INSERT INTO Person (name) SELECT 'Person #' || (IFNULL((MAX(id)+1),1)) FROM Person LIMIT 1;

这个将得到自动增量的索引:

INSERT INTO Person (name) SELECT 'Person #' || (seq+1) FROM sqlite_sequence WHERE name="person"

您也可以这样做:

INSERT INTO Person (name) VALUES (NULL);
INSERT INTO Person (name) VALUES (NULL);
INSERT INTO Person (name) VALUES (NULL);
INSERT INTO Person (name) VALUES (NULL);
INSERT INTO Person (name) VALUES (NULL);
INSERT INTO Person (name) VALUES (NULL);
INSERT INTO Person (name) VALUES (NULL);
INSERT INTO Person (name) VALUES (NULL);
UPDATE Person SET name = 'Person #' || id WHERE name IS NULL;

或者:

INSERT INTO Person (name) VALUES ('Person');
UPDATE Person SET name = name || ' #' || id WHERE id = last_insert_rowid();

这个将更新没有#及其行ID:

的名称
INSERT INTO Person (name) VALUES ('Person');
INSERT INTO Person (name) VALUES ('Person');
INSERT INTO Person (name) VALUES ('Person');
INSERT INTO Person (name) VALUES ('Person');
UPDATE Person SET name = name || ' #' || id WHERE (LENGTH(name)-LENGTH(REPLACE(name, '#', ''))) = 0;

Live DEMO

答案 2 :(得分:1)

你必须做两个句子:INSERT + UPDATE,你不能访问当前插入句子中的最后一个插入id

答案 3 :(得分:1)

在插入行之前,系统无法可靠地知道ID。我认为最好的解决方案是视图(因为SQLite不支持计算列,这将是最简单的路径)。只需插入VARCHAR并使用视图在请求时使用插入的VARCHAR和已分配的ID构建连接值。

祝你好运!

答案 4 :(得分:0)

这不保证,但这可能有用......

INSERT INTO tab1(val) VALUES ('tab1 #' + cast((SELECT top 1 IDENT_CURRENT('tab1') + IDENT_INCR('tab1') FROM tab1) as varchar(20)))
相关问题