这看起来很简单:我想在 SQLite 表中复制一行:
INSERT INTO table SELECT * FROM table WHERE rowId=5;
如果没有显式的唯一列声明,则该语句将起作用,但声明了表的第一列rowID INTEGER NOT NULL PRIMARY KEY
。有没有办法创建一个像上面这样的简单语句,无需知道表的架构(除了第一列)?
这可以使用 * 语法来完成,而无需知道表的架构(除了主键的名称)。诀窍是使用“CREATE TABLE AS”语法创建临时表。
在此示例中,我假设有一个名为“src”的现有已填充表,其中包含一个名为“id”的整数主键以及其他几个列。要复制“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 http://www.sqlite.org/lang_createtable.html
“CREATE TABLE ... AS SELECT”语句根据 SELECT 语句的结果创建并填充数据库表。使用 CREATE TABLE AS 创建的表没有 PRIMARY KEY,也没有任何类型的约束。
如果您想要真正喜欢,您可以添加一个触发器来更新第三个表,该表将旧的主键映射到新生成的主键。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)