代码之家  ›  专栏  ›  技术社区  ›  Rabadash8820

为什么此sqlite脚本会影响多行?

  •  0
  • Rabadash8820  · 技术社区  · 7 年前

    我有以下简单的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;
    

    在数据库浏览器中为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??
              }
          }
    }
    

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

    1 回复  |  直到 7 年前
        1
  •  5
  •   Rabadash8820    7 年前

    啊,我知道了。整数 version 正在定义字段 AUTOINCREMENT ,其中 also adds 最大的rowid到内部 sqlite_sequence 正在添加第二行。