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

时间:2009-11-11 16:25:51

标签: sql sqlite

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

INSERT INTO table SELECT * FROM table WHERE rowId=5;

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

4 个答案:

答案 0 :(得分: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;

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

来自sqlite文档:http://www.sqlite.org/lang_createtable.html

  

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

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

答案 1 :(得分:8)

没有。您需要知道表的模式才能正确编写插入语句。

您需要能够以下列形式编写声明:

insert into Table (column1, column2, column3) 
select column1, column2, column3
from OtherTable
where rowId = 5

答案 2 :(得分:5)

好吧,因为我无法按照我想要的方式执行此操作,所以我使用了隐式行id,它与我明确定义的rowId列具有相同的名称,所以现在我可以使用我的查询在问题中,它将使用新的rowId插入所有数据。为了让计划的其余部分有效,我只是将SELECT * FROM table更改为SELECT rowId,* FROM table,一切都很好。

答案 3 :(得分:0)

绝对没办法做到这一点。主键声明暗示此字段是唯一的。你不能拥有非独特的PK。无法在同一个表中创建具有现有PK的行。