sql - 如何在具有唯一 ID 的 SQLite 中插入重复行?

标签 sql sqlite

这看起来很简单:我想在 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

A "CREATE TABLE ... AS SELECT" statement creates and populates a database table based on the results of a SELECT statement. A table created using CREATE TABLE AS has no PRIMARY KEY and no constraints of any kind.

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

关于sql - 如何在具有唯一 ID 的 SQLite 中插入重复行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1716320/

相关文章:

iphone - 模拟器中的文档文件夹为空。我的 db.sqlite 在哪里?

ios - Swift:获取结果集中的行数

mysql - 在 SQL 中如何合并两个表而不丢失任何行?

sql - 登录本地 SQL Server 失败

c# - 查找给定日期是否在日期范围列表中

bash - bash 脚本中 sqlite 的安全副本

mysql - 在 sql 查询中返回前 3 个计数值

c++ - 如何使用复合键删除 SQLite ORM 中的条目

c# 将 linq 数据库记录转换为类实例

java - 更新语句语法错误