我有一个带有自动增量字段和另一个字段的表VARCHAR
。我想直接在插入查询中用新生成的 id 填充字符串字段。以表为例:
Person
(
id auto_increment,
name varchar
)
我想执行这样的查询:
INSERT INTO Person(name) VALUE ('Person #' + ROWID())
无论如何要这样做?
这将使用增量为 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;
您不应该将相同的信息存储两次。只需在查询时动态生成所需的字符串:
SELECT name || '#' || id FROM Person
必须做两句话:INSERT + UPDATE,不能访问当前插入语句中的最后一个插入id
ID
在插入行之前,系统不会可靠地知道这一点。我认为最好的解决方案是视图(因为 SQLite 不支持计算列,这将是最简单的方法)。只需插入VARCHAR
并使用视图在请求时使用插入VARCHAR
的和分配的来构建连接值ID
。
祝你好运!
这不会得到保证,但这可能会奏效......
INSERT INTO tab1(val) VALUES ('tab1 #' + cast((SELECT top 1 IDENT_CURRENT('tab1') + IDENT_INCR('tab1') FROM tab1) as varchar(20)))