【问题标题】:SQLite: Add column with primary key to existing table whilst persisting dataSQLite:在保留数据的同时将具有主键的列添加到现有表
【发布时间】:2015-04-01 14:48:41
【问题描述】:

在 SQLite 的上下文中。

我有一个现有的表,该表当前填充了许多数据行。

我正在尝试向该表添加一个新的主键列,同时保留原始数据。

如下所示,我尝试了以下方法

  1. 向现有表(Id INTEGER)添加一个新列。
  2. 更改现有表的名称。
  3. 创建一个包含新主键(Id INTEGER PRIMARY KEY)的新表。
  4. 将重命名表中的所有数据插入新创建的表中。
  5. 删除重命名的表。

我认为这会起作用的原因是因为根据 SQlite 文档,

声明为 INTEGER PRIMARY KEY 的列将自动递增。

但是我收到以下错误。

ErrorCode : 19
Message   : constraint failed
UNIQUE constraint failed: Person.Id
Result    : Constraint

这是我的代码。

--Add a new column to the existing table(Id INT).
ALTER TABLE [Person]
ADD Id INTEGER;

--Change the name of the existing table.
ALTER TABLE [Person] RENAME TO Person_temp;

--Create a new table which includes the new PK.
CREATE TABLE Person(
    Id INTEGER PRIMARY KEY,
    FirstName nvarchar(100) NULL,
    LastName nvarchar(100) NULL
);

--Insert all data from the renamed table into the new table.
INSERT INTO Person SELECT * FROM Person_temp;

--Drop the renamed table.
DROP TABLE Person_temp;

有人能解释一下吗?

【问题讨论】:

    标签: database sqlite unique-constraint


    【解决方案1】:

    由于您没有在插入查询中声明列名,因此列顺序取决于它们创建/添加的顺序。尝试指定列名。无论如何,这通常是一个好习惯

    --Insert all data from the renamed table into the new table.
    INSERT INTO Person(Id, FirstName, LastName) SELECT Id, FirstName, LastName FROM Person_temp;
    

    顺便说一句,您可能不需要在第一个表中添加Id 列:

    --Insert all data from the renamed table into the new table.
    INSERT INTO Person(FirstName, LastName) SELECT FirstName, LastName FROM Person_temp;
    

    Id 的隐式空值将被自动增量替换

    【讨论】:

    • 正是我想要的。你也说得对,我可能不需要第一个表中的 Id 列。干杯
    【解决方案2】:

    您的 Id 列似乎在每一行中都不包含唯一值。由于您刚刚添加了列,因此每一行都将具有相同的值。

    自动增量可以在您插入新行时提供帮助。 (您不必选择 max(id),并插入 id = max+1 的新行)。它不会自动填充现有的数据表。

    SQLite 已经有一个列可以满足您的需求。它被称为 ROWID。尝试使用它而不是与您的 Id 列复制它。

    【讨论】:

    • 虽然这很有帮助,但 bwt 的回答更完整。一旦我的声誉达到 15,我将确保回来并将此答案标记为有用。感谢您的意见。
    • 当然是布兰登。很高兴您找到了解决方案。
    猜你喜欢
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 2018-07-13
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多