【问题标题】:How to insert the data into a table with different number of columns in SQL如何在SQL中将数据插入具有不同列数的表中
【发布时间】:2020-12-24 10:28:59
【问题描述】:

我正在尝试将数据从一个表复制到另一个表。请找到以下代码:

//Dummy table for reference
database.execSQL("CREATE TABLE IF NOT EXISTS `New_Temp1` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `data1` TEXT DEFAULT '', `data2` INTEGER NOT NULL, `data3` TEXT DEFAULT '', `data4` TEXT DEFAULT '', `data5` TEXT DEFAULT '')");
database.execSQL("INSERT INTO New_Temp1 SELECT * FROM Temp1");
database.execSQL("DROP TABLE Temp1");
database.execSQL("ALTER TABLE New_Temp1 RENAME TO Temp1");

Temp1 表已经存在于数据库中。我不知道它的架构。意味着我不知道该表的列。所以我正在创建一个新表 New_temp1。当我尝试将数据从 Temp1 复制到 New_Temp1 时,应用程序崩溃。

**Caused by: android.database.sqlite.SQLiteException: table New_Temp1 has 33 columns but 28 values were supplied (code 1): , while compiling: INSERT INTO New_Temp1 SELECT * FROM Temp1**

如何解决,不知道 Temp1 表中缺少哪些列。

【问题讨论】:

  • 您创建了包含 33 列的 New_Temp1,并且您想从 Temp1 复制 28 列。如果您不知道应该将哪一列复制到哪一列,那么您就不能这样做。
  • @forpas 我可以知道我缺少哪些列吗?
  • 检查我的答案。

标签: android sql android-sqlite sql-insert


【解决方案1】:

此语句引发错误:

INSERT INTO New_Temp1 SELECT * FROM Temp1

看起来目标表的列与原始表的列不同(目标中的列更多)。

如果你想在不知道结构的情况下复制表,你可以将表的创建和复制结合在一个语句中:

CREATE TABLE New_Temp1 AS
SELECT * FROM Temp1

另一方面,如果不想复制所有列,并且知道源表中对应的列名,那么可以在select子句中枚举它们:

INSERT INTO New_Temp1 (data1, data2, data3)
SELECT data1, data2, data3 FROM Temp1

【讨论】:

  • 但我想要 New_Temp1 表中的所有列。
  • 我不知道 temp1 的列名。
  • 有没有办法将所有数据从 Temp1 复制到 new_temp 以及 Temp1 的新列。
  • @Arcana:这是我回答的第二部分。您需要枚举列。
【解决方案2】:

您可以通过此查询获取表Temp1 的列名:

SELECT name FROM pragma_table_info('Temp1')

您可以使用rawQuery() 执行上述语句,并通过遍历游标的行,您将获得所有列名,您可以使用它们来创建新表。

如果你执行:

SELECT * FROM pragma_table_info('Temp1')

您将获得每列的其他信息,例如:

cid name    type    notnull dflt_value  pk
0   column1 INTEGER 0       0
1   column2 INTEGER 0       0
...........................................

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-08
    • 2013-05-23
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    相关资源
    最近更新 更多