在SQLite

时间:2016-04-11 19:49:40

标签: c# wpf sqlite

我正在创建一个表,首先keyID列不在AUTO INCREMENT中,因为我要插入来自旧数据库的数据,其中keyID已经设置为每行,并且无法更改。所有数据移动后,我可以将列设置为AUTO INCREMENT吗?我见过这个:

ALTER TABLE tbl_name MODIFY COLUMN keyID_id INT auto_increment

因此,如果我在移动所有数据后将keyID设置为自动递增,那么例如已经传输了10行并且可能缺少某些数字,例如,keyID:1,2,3,5,6,7 ... 15

我可以假设在将keyID设置为自动递增后,下一行将是keyID 16吗?

2 个答案:

答案 0 :(得分:0)

首先要说的是SQLite没有更改列设置的语法。您被迫重命名原始表,使用所需的模式创建一个新表,然后从重命名的表复制到新表。

因此,将AUTOINCREMENT标志添加到表中的代码就是这样的

SQLiteCommand cmd = new SQLiteCommand();
cmd.Connection = yourConnection;
cmd.CommandText = "ALTER TABLE tblName RENAME TO tmp_tblName";
cmd.ExecuteNonQuery();
cmd = new SQLiteCommand(@"
    CREATE TABLE tblName 
    (ID INTEGER PRIMARY KEY AUTOINCREMENT, 
     AnotherField NVARCHAR(100) NOT NULL)", cnn);
cmd.ExecuteNonQuery();             
cmd.CommandText = "INSERT INTO tblName (ID, AnotherField) SELECT ID, AnotherField FROM tmp_tblName";
cmd.ExecuteNonQuery();

现在,当您使用AUTOINCREMENT SQLite创建表时,将新行添加到名为sqlite_sequence的内部表中。这个表可以通过通常的ADO.NET类来读取

cmd.CommandText = "SELECT seq FROM sqlite_sequence WHERE name = 'tblName'";
int lastInsertedValue = Convert.ToInt32(cmd.ExecuteScalar());
Console.WriteLine(lastInsertedValue);

如果运行此测试代码,您将看到字段seq的值等于PRIMARY KEY字段中插入的最大值。 在此之后,如果您尝试在表中插入新记录,您将看到AUTOINCREMENT标志已按预期开始工作,您的新记录将从序列中接收下一个值....

答案 1 :(得分:0)

即使SQLite documentationsome posts声明SQLite中的alter table命令非常有限且不允许进行此类修改,但它似乎仍然存在可能会改变PK属性。对我有用的是:

  1. 创建一个包含CREATE TABLE "test" ( Field1 INTEGER, Field2 TEXT,)
  2. 的表格
  3. 插入任意数据
  4. 使用DB Browser for SQLite更改列Field1的列定义 然后,后续插入应自动增加Field1列中的ID。
  5. 我必须承认,如果要求以编程方式执行此操作可能不合适,但如果某些手动步骤可以接受,则可能是一种解决方案。