假设我有一张简单的表格:
create table foo
{
id INTEGER PRIMARY KEY AUTOINCREMENT,
bar INTEGER
}
我想插入一个新行,以便id == bar
数据库选择id
的值,a.k.a。自动增量。
这样的事情:
INSERT INTO foo (id, bar) VALUES (NULL, id)
是否可以在一个声明中这样做?
那是什么SQL语法?
答案 0 :(得分:6)
在SQLite中你可以
BEGIN TRANSACTION;
INSERT INTO foo (id, bar) VALUES (NULL, 0);
UPDATE foo SET bar = id WHERE _ROWID_ = last_insert_rowid();
COMMIT;
确保没有其他语句妨碍你的双语句表达式。
答案 1 :(得分:3)
你不能拥有two auto increment fields。您应该使用单个自动增量字段。鉴于两个字段对于每一行总是具有相同的值,所以无论如何都没有理由去过这样的字段。
但你可以设置触发器,它会在插入行后更新另一个等于自动递增值的字段。并且当您不希望它们具有相同的值时删除该触发器。
CREATE TRIGGER update_foo AFTER INSERT ON foo
BEGIN
UPDATE foo SET bar = NEW.id ;
END;
当最终栏将被更改为与id不同的值时,则删除触发器
DROP TRIGGER update_foo
答案 2 :(得分:1)
这不是在一个查询中完成的,但可以在存储过程中使用。重复该集合以显示它根据数据库创建的ID进行插入和更新。这是在SQL Server 2008R2上完成的
declare @tmpTable TABLE (
id INT identity(1,1),
bar INT
)
declare @myId INT
insert @tmpTable (bar) values (0)
SET @myId = SCOPE_IDENTITY()
update @tmpTable SET bar = @myId where id = @myId
insert @tmpTable (bar) values (0)
SET @myId = SCOPE_IDENTITY()
update @tmpTable SET bar = @myId where id = @myId
insert @tmpTable (bar) values (0)
SET @myId = SCOPE_IDENTITY()
update @tmpTable SET bar = @myId where id = @myId
insert @tmpTable (bar) values (0)
SET @myId = SCOPE_IDENTITY()
update @tmpTable SET bar = @myId where id = @myId
select * FROM @tmpTable
输出的
id bar
1 1
2 2
3 3
4 4
答案 3 :(得分:0)
正如评论中提到的,我认为这将特定于每个数据库实现,因此了解您正在使用的服务器是有用的。但是,对于MySQL,你可以这样做:
INSERT INTO foo (bar)
SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_schema = DATABASE()
AND TABLE_NAME = 'foo';
或者,既然你可能正在使用SQLite(基于标签),你可以试试这个:
INSERT INTO foo (bar)
SELECT (seq + 1)
FROM sqlite_sequence
WHERE name = 'foo';
答案 4 :(得分:0)
您可以将其用作:
INSERT INTO foo (bar) VALUES (last_insert_rowid()+1)
生成的ID在服务器上维护 每个连接基础。这意味着返回的值 给定客户端的函数是生成的第一个AUTO_INCREMENT值 对于影响AUTO_INCREMENT列的最新语句 客户。此值不受其他客户端的影响,即使它们也是如此 生成自己的AUTO_INCREMENT值。此行为可确保 每个客户端都可以检索自己的ID而无需担心 其他客户的活动,无需锁或 交易。
答案 5 :(得分:0)
insert into [Test].[dbo].[foo] (bar) select MAX(id)+1 from [Test].[dbo].[foo]
答案 6 :(得分:-2)
INSERT INTO foo (bar) VALUES (id)