【问题标题】:Can I alter a column in an sqlite table to AUTOINCREMENT after creation?我可以在创建后将 sqlite 表中的列更改为 AUTOINCREMENT 吗?
【发布时间】:2010-10-12 11:26:54
【问题描述】:

建表后我可以建一个字段AUTOINCREMENT吗?例如,如果您创建这样的表:

create table person(id integer primary key, name text);

后来意识到它需要自动递增。我该如何解决它,即在 MySQL 中你可以这样做:

alter table person modify column id integer auto_increment

创建表是创建列AUTOINCREMENT的唯一机会吗?

【问题讨论】:

  • 你得到解决方案了吗?

标签: sqlite


【解决方案1】:

您可以将内容转储到新表中:

CREATE TABLE failed_banks_id (id integer primary key autoincrement, name text, city text, state text, zip integer, acquired_by text, close_date date, updated_date date);

INSERT INTO failed_banks_id(name, city, state, zip, acquired_by,close_date, updated_date)
SELECT name, city, state, zip, acquired_by,close_date, updated_date
FROM failed_banks;

并重命名表格:

DROP TABLE failed_banks;
ALTER TABLE failed_banks_id RENAME TO failed_banks;

【讨论】:

  • 简单总是最好的选择。谢谢。
  • 确保还插入旧表中的id 列,以防某些行被删除。否则,由于 id 将连续重新生成,因此使用 id 作为键的其他表中的任何链接都将指向新表中的错误行。
  • 有效。 sqlite 的局限性简直太荒谬了。
【解决方案2】:

背景:

新密钥将是唯一的 当前在表中的键,但它 可能与已被 以前从表中删除。到 创建唯一的密钥 表的生命周期,添加 INTEGER 的 AUTOINCREMENT 关键字 PRIMARY KEY 声明。

http://www.sqlite.org/faq.html#q1

SQLite 限制:

SQLite 支持有限的子集 更改表。 ALTER TABLE 命令 在 SQLite 中允许用户重命名 表或将新列添加到 现有表。这是不可能的 重命名列,删除列,或 添加或删除约束 表。

http://www.sqlite.org/lang_altertable.html

Hack 似乎存在:

看来可以设置

PRAGMA writable_schema=ON;

然后手动更新 sqlite_master 表插入一个“id INTEGER PRIMARY KEY" 到 SQL 中 表定义。我试过了 它似乎工作。但它是 危险的。如果你搞砸了,你 损坏数据库文件。

http://www.mail-archive.com/sqlite-users@sqlite.org/msg26987.html

【讨论】:

  • 通过导出(转储)再导入的方式来做,危险性会小一些。
【解决方案3】:

来自SQLite Faq

简答:声明为 INTEGER PRIMARY KEY 的列将自动递增

因此,当您创建表时,将列声明为 INTEGER PRIMARY KEY,并且该列将随着每次新插入而自动递增。

或者您在事后使用 SQL 语句 ALTER 将列类型更改为 INTEGER PRIMARY KEY,但如果您自己创建表,最好在初始创建语句中进行。

【讨论】:

  • 说“在初始创建语句中做”很好,问题是如果你已经完成了初始创建语句,你如何解决它。
  • up for:声明为 INTEGER PRIMARY KEY 的列将自动递增
  • 正确地说 INTEGER PRIMARY KEY 列将在插入时自动递增。说这样的列是 ROWID 列的别名更为正确,ROWID 列是大多数表中存在的 64 位整数键。此外,在定义这些列时使用 AUTOINCREMENT 关键字将更改增量行为,从而永远不会回收值。综上所述,这个答案并没有真正解决关于更改现有表的问题的核心。
  • 感谢上帝。这种自动增量节省了我的时间。
  • 取决于正在寻找的自动增量行为。如果未指定 AUTOINCREMENT,它仍然会自动递增,但会重用已删除的键。如果您希望键在表的整个生命周期中是唯一的,则必须指定 AUTOINCREMENT。是的,这很令人困惑,而且这个答案没有清楚地解释这个概念,所以它可能会误导一些人。
【解决方案4】:

最简单的方法 - 只需导出和重新导入

这是可能的,而且相对容易。将数据库导出为 sql 文件。更改 SQL 文件并重新导入:

  sqlite3 mydata.db .dump > /tmp/backup.sql
  vi /tmp/backup.sql
  mv mydata.db mydata.db.old
  sqlite3 mydata.db
  sqlite>.read /tmp/backup.sql

【讨论】:

  • 这不适用于自动增量列 - 至少对我而言,将值插入自动增量列会使该行不可读
  • 这还需要仅针对服务器方案的管理手动操作。如果每个客户端都安装了 db,则无法从代码中执行此操作,
  • 对我来说工作得很好。我已将 "id" int(11) NOT NULL 替换为 "id" integer primary key autoincrement 并删除了 .sql 文件中的 PRIMARY KEY ("id") 行。
【解决方案5】:

您可以使用 SQLite Expert Personal 4 来做到这一点:

1) 选择表格,然后转到“设计”选项卡>“列”选项卡。

2) 点击“添加”并选择新的列名,然后输入 INTEGER and Not Null > Ok。

3) 转到“设计选项卡”中的“主键”选项卡。单击“添加”并选择刚刚创建的列。选中“自动增量”框。

4) 点击窗口右下角的“应用”。

如果您返回“数据”标签,您将看到包含自动生成数字的新列。

【讨论】:

    【解决方案6】:

    虽然 Sqlite 网站为您提供了一个示例,如何使用只有三个字段的表来执行此操作,但使用 30 个字段中的一个会变得很讨厌。假设您有一个名为 OldTable 的表,其中包含许多字段,其中第一个是用整数填充的“ID”。 制作数据库的副本以进行备份。 使用命令程序点命令,

        .output Oldtable.txt
        .dump Oldtable
        Drop Table Oldtable;
    

    在 Microsoft Word 或类似 grep 的文本编辑器中打开 Oldtable.txt。查找并用 NULL 替换您的 Integer 字段元素。(您可能需要调整它以适合您的字段)。编辑 Create Table 行,使定义为 Integer 的字段现在是 INTEGER PRIMARY KEY AUTOINCREMENT。 另存为 NewTable.txt

    回到命令程序点

       .read NewTable.txt
    

    完成。 ID 现在是自动递增的。

    【讨论】:

      【解决方案7】:

      是的 你有安装 phpmyadmin 吗?我相信如果您转到“结构”选项卡并沿着右侧的列(列出字段类型的位置)查看 - 我认为您可以在那里更改设置以使其自动递增。还有一个 SQL 查询可以做同样的事情。

      【讨论】:

        【解决方案8】:

        你可以改变表,改变列定义

        【讨论】:

          【解决方案9】:

          在 SQLite 表创建后,您不能更改其列。您也不能更改表以向其添加整数主键。

          您必须在创建表时添加整数主键。

          【讨论】:

            【解决方案10】:

            是的,您可以创建一个自动递增的列。修改表并添加一列。请记住,它是 INTEGER 主键类型。

            【讨论】:

              【解决方案11】:

              简单回答如下,

              CREATE TABLE [TEST] (
                [ID] INTEGER PRIMARY KEY AUTOINCREMENT, 
                [NAME] VARCHAR(100));
              

              你就完成了。

              【讨论】:

              • 没有阅读问题。它是如何在创建表/之后添加自动增量。
              猜你喜欢
              • 2018-07-03
              • 2017-01-26
              • 1970-01-01
              • 2011-11-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多