【问题标题】:Is primary key Auto incremented by default? [closed]默认情况下主键自动递增吗? [关闭]
【发布时间】:2022-01-13 12:58:34
【问题描述】:

我创建了一个主键为 INTEGER 的表,但没有将其指定为自动增量。 尽管如此,当我向数据库添加新行时,它会自动增加主键。我错过了什么吗?如果不是,我们如何使主键不自动递增?

我正在使用 SQLite 数据库

代码:

CREATE TABLE test (id INTEGER PRIMARY KEY, name TEXT);

INSERT INTO test (name) VALUES ('John');

INSERT INTO test (name) VALUES ('Mary');

将 John id 设为 1,Mary id 设为 2,即它会自动递增而不为 id 指定它

【问题讨论】:

  • 这取决于您使用的数据库类型...问题中缺少的信息。
  • @Joel Coehoorn 谢谢,请查看编辑
  • 请阅读SQLite autoincrement,然后重新测试您的代码!
  • @Luuk 好的,除了明显的,其他地方都很好。谢谢
  • 我猜现在你已经得到了你需要的答案:将列定义为INT 而不是INTEGER

标签: sql sqlite


【解决方案1】:

这是因为在 sqlite 中,使用类型为 INTEGER PRIMARY KEY 的列会创建 rowid 的别名。如果没有提供列值,这将自动为 INSERT 上的列分配一个 id,即 rowid。

如果您明确指定 INTEGER PRIMARY KEY AUTOINCREMENT 作为类型,它将更改使用 rowid 的默认行为。一个变化是之前删除的 rowid 不会被重新使用。

【讨论】:

    【解决方案2】:

    每个品牌的 SQL 数据库都以不同的方式实现自增主键。有这么多变化真是奇怪。

    在 SQLite 的情况下,如果您将主键列定义为 INTEGER,则它隐含地是一个自增列。

    它必须是INTEGER,因为如果数据类型只是INT,则不会发生这种自动行为。

    Demo.

    【讨论】:

      【解决方案3】:
      D:\TEMP>sqlite3
      -- Loading resources from C:\Users\Luuk/.sqliterc
      SQLite version 3.37.0 2021-11-27 14:13:22
      Enter ".help" for usage hints.
      Connected to a transient in-memory database.
      Use ".open FILENAME" to reopen on a persistent database.
      sqlite> CREATE TABLE test (id INT PRIMARY KEY, name TEXT);
      sqlite> INSERT INTO test (name) VALUES ('John');
      sqlite> INSERT INTO test (name) VALUES ('Mary');
      sqlite>
      sqlite> SELECT * FROM test;
      id  name
      --  ----
          John
          Mary
      sqlite>
      

      不,它不会自动递增...

      并且,当使用 INTEGER 时:

      D:\TEMP>sqlite3
      -- Loading resources from C:\Users\Luuk/.sqliterc
      SQLite version 3.37.0 2021-11-27 14:13:22
      Enter ".help" for usage hints.
      Connected to a transient in-memory database.
      Use ".open FILENAME" to reopen on a persistent database.
      sqlite> CREATE TABLE test(id INTEGER primary key, name TEXT);
      sqlite> INSERT INTO test(name) VALUES ('John');
      sqlite> INSERT INTO test(name) VALUES ('Mary');
      sqlite>
      sqlite> SELECT * FROM test;
      id  name
      --  ----
      1   John
      2   Mary
      sqlite>
      

      啊,现在在哪里递增!

      但它已全部记录在案,请参阅:https://www.sqlite.org/autoinc.html

      【讨论】:

      • INTEGER 而不是 INT,我编辑了问题中的代码
      • 好的,进行了编辑。
      【解决方案4】:

      通过设置 IDENTITY 属性打开主键的自动递增。例如:

      CREATE TABLE [dbo].[Customers](
          [id] [int] IDENTITY(1,1) NOT NULL,
          [CompanyName] [varchar](100) NOT NULL,
          [PhoneNumber] [varchar](20) NOT NULL,
          [EmailAddress] [varchar](100) NOT NULL,
          [CreateDate] [datetime2](7) NOT NULL,
          [LastUpdated] [datetime2](7) NOT NULL,
          CONSTRAINT [PK_Customers] PRIMARY KEY CLUSTERED 
          (
              [id] ASC
          )
          WITH
          (
              PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
          ) ON [PRIMARY]
      

      【讨论】:

      • 谢谢这很有用,虽然我仍然想知道为什么它会自动递增而不我指定它,检查编辑,我添加了代码和结果
      • 请分享更多细节。这与问题有什么关系?这个表定义看起来不像 SQLite 可以处理的那样
      • 在发布此答案时,该问题仅被标记为 sql,有些人认为这暗示了 Microsoft SQL Server。但在 Stack Overflow 上,标签“sql”指的是 SQL 语言,而不是任何一个品牌或实现。在 Stack Overflow 上,sql-server 标记用于 Microsoft SQL Server。
      猜你喜欢
      • 2015-09-03
      • 1970-01-01
      • 1970-01-01
      • 2013-09-28
      • 2017-02-10
      • 2016-12-12
      • 1970-01-01
      • 2021-05-23
      • 2019-06-26
      相关资源
      最近更新 更多