如何在SQLite中使用唯一ID插入重复行?

Ed *_*rty 12 sql sqlite

这看起来很简单:我想在SQLite表中复制一行:

INSERT INTO table SELECT * FROM table WHERE rowId=5;
Run Code Online (Sandbox Code Playgroud)

如果没有明确的唯一列声明,则该语句将起作用,但声明了表的第一列rowID INTEGER NOT NULL PRIMARY KEY.是否有任何方法可以创建一个简单的语句,如上所述,在不知道表的模式的情况下工作(除了第一列)?

小智 23

这可以使用*语法来完成,而不必知道表的模式(主键的名称除外).诀窍是使用"CREATE TABLE AS"语法创建临时表.

在这个例子中,我假设有一个名为"src"的现有的,填充的表,其中有一个名为"id"的INTEGER PRIMARY KEY,以及其他几个列.要复制"src"的行,请在SQLite3中使用以下SQL:

CREATE TEMPORARY TABLE tmp AS SELECT * FROM src;
UPDATE tmp SET id = NULL;
INSERT INTO src SELECT * FROM tmp;
DROP TABLE tmp;
Run Code Online (Sandbox Code Playgroud)

上面的例子复制了表"src"的所有行.要仅复制所需的行,只需在第一行添加WHERE子句即可.此示例有效,因为表"tmp"没有主键约束,但"src"没有.将NULL主键插入src会导致它们被赋予自动生成的值.

从sqlite文档:http://www.sqlite.org/lang_createtable.html

"CREATE TABLE ... AS SELECT"语句根据SELECT语句的结果创建并填充数据库表.使用CREATE TABLE AS创建的表没有PRIMARY KEY,也没有任何类型的约束.

如果你想变得非常花哨,你可以添加一个触发器来更新第三个表,它将旧的主键映射到新生成的主键.


Jus*_*ner 8

不需要.您需要知道表的模式才能正确编写insert语句.

您需要能够以下列形式编写语句:

insert into Table (column1, column2, column3) 
select column1, column2, column3
from OtherTable
where rowId = 5
Run Code Online (Sandbox Code Playgroud)


Ed *_*rty 5

好吧,因为我无法按照我想要的方式执行此操作,所以我使用了隐式行id,它与我明确定义的rowId列具有相同的名称,所以现在我可以使用我在问题中的查询,它将使用新的rowId插入所有数据.为了使程序工作的休息,我刚换SELECT * FROM tableSELECT rowId,* FROM table,一切都很好.

  • 这对我不起作用,它说“提供了 n+1 个值,其中 n 列可用” (2认同)