插入表并将另一列设置为自动增量列值

时间:2015-12-15 14:48:50

标签: sql sqlite insert auto-increment

假设我有一张简单的表格:

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语法?

7 个答案:

答案 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)