【问题标题】:Why is this SQLite Script Affecting Multiple Rows?为什么这个 SQLite 脚本会影响多行?
【发布时间】:2018-05-26 20:23:52
【问题描述】:

我有以下简单的 SQLite 脚本来创建一个带有版本控制表的新数据库:

BEGIN TRANSACTION;
CREATE TABLE IF NOT EXISTS `db_versions` (
    `version`   integer NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
    `name`  varchar ( 50 ) DEFAULT NULL UNIQUE,
    `date_defined`  datetime DEFAULT NULL,
    `comments`  text
);
INSERT INTO `db_versions` VALUES (0,'initial-create','2017-12-02 14:41:56',NULL);
COMMIT;

在 DB Browser for SQLite 日志中运行此脚本正确记录了只有 1 行受到影响(插入)。但是,当我尝试使用 Mono (Mono.Data.Sqlite) 在代码中执行此脚本时,该脚本显然会影响 2 行。这是代码:

using (var conn = new SqliteConnection(_connStr)) {
    await conn.OpenAsync(cancellationToken);
      using (SqliteCommand comm = conn.CreateCommand()) {
          comm.CommandType = CommandType.Text;
          comm.CommandText = @"
              BEGIN TRANSACTION;
              CREATE TABLE IF NOT EXISTS `db_versions` (
                  `version` integer NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
                  `name`    varchar ( 50 ) DEFAULT NULL UNIQUE,
                  `date_defined`    datetime DEFAULT NULL,
                  `comments`    text
              );
              INSERT INTO `db_versions` VALUES (0,'initial-create','2017-12-02 14:41:56',NULL);
              COMMIT;
          ";
          int rowsAffected = await comm.ExecuteNonQueryAsync(cancellationToken);
          if (rowsAffected > 1) {
              // Why is this code running??
          }
      }
}

有人知道为什么我会得到这些不同的结果吗?

【问题讨论】:

  • 出于好奇,如果您删除插入并仅保留创建,是否会返回一行?
  • @pinkfloydx33 好问题。如果没有 INSERT 语句,查询不会影响任何行。我还可以确认INSERT语句运行后db中只有一行;似乎没有添加第二行

标签: c# sql sqlite mono ado.net


【解决方案1】:

啊,我想通了。整数version 字段被定义为AUTOINCREMENT,其中also adds 是内部sqlite_sequence 表的最大ROWID。所以 添加了第二行。

【讨论】:

  • 我怀疑由于自动增量而添加了第二行。
  • @CodingYoshi 有:1 行手动插入到新的db_versions 表中,1 行由 SQLite 自动插入到sqlite_sequence 表中
  • 哦,我明白了。是的,即使在数据库浏览器端它也会这样做。你为什么会关心
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
  • 2012-05-29
  • 2011-08-02
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多