3

我有一个带有自动增量字段和另一个字段的表VARCHAR。我想直接在插入查询中用新生成的 id 填充字符串字段。以表为例:

Person
(
    id auto_increment, 
    name varchar
)

我想执行这样的查询:

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

无论如何要这样做?

4

5 回答 5

3

这将使用增量为 1 的最后插入的行 id 来生成下一个人员 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更新没有 a 的名称:

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;

现场演示

于 2013-08-22T16:12:06.283 回答
2

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

SELECT name || '#' || id FROM Person
于 2013-08-22T16:10:31.223 回答
1

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

于 2013-08-22T16:10:16.737 回答
1

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

祝你好运!

于 2013-08-22T16:11:52.167 回答
0

这不会得到保证,但这可能会奏效......

INSERT INTO tab1(val) VALUES ('tab1 #' + cast((SELECT top 1 IDENT_CURRENT('tab1') + IDENT_INCR('tab1') FROM tab1) as varchar(20)))
于 2013-08-22T16:10:35.940 回答