这看起来很简单:我想在SQLite表中复制一行:
INSERT INTO table SELECT * FROM table WHERE rowId=5;
如果没有明确的唯一列声明,则该语句将起作用,但声明了表的第一列rowID INTEGER NOT NULL PRIMARY KEY
.是否有任何方法可以创建一个简单的语句,如上所述,在不知道表的模式的情况下工作(除了第一列)?
这可以使用*语法来完成,而不必知道表的模式(主键的名称除外).诀窍是使用"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,也没有任何类型的约束.
如果你想变得非常花哨,你可以添加一个触发器来更新第三个表,它将旧的主键映射到新生成的主键.
不需要.您需要知道表的模式才能正确编写insert语句.
您需要能够以下列形式编写语句:
insert into Table (column1, column2, column3) select column1, column2, column3 from OtherTable where rowId = 5
好吧,因为我无法按照我想要的方式执行此操作,所以我使用了隐式行id,它与我明确定义的rowId列具有相同的名称,所以现在我可以使用我在问题中的查询,它将使用新的rowId插入所有数据.为了使程序工作的休息,我刚换SELECT * FROM table
到SELECT rowId,* FROM table
,一切都很好.