【问题标题】:How to AUTO_INCREMENT in db2?如何在 db2 中进行 AUTO_INCREMENT?
【发布时间】:2012-11-08 02:46:18
【问题描述】:

我认为这很简单,但我似乎无法在我的 db2 数据库中使用 AUTO_INCREMENT。我做了一些搜索,人们似乎在使用“默认生成”,但这对我不起作用。

如果有帮助,这是我要创建的表,其中 sid 自动递增。

  create table student(
      sid integer NOT NULL <auto increment?>
      sname varchar(30),
      PRIMARY KEY (sid)
      );

任何指针表示赞赏。

【问题讨论】:

    标签: db2 auto-increment


    【解决方案1】:

    您要查找的称为 IDENTITY 列:

    create table student (
       sid integer not null GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1)
      ,sname varchar(30)
      ,PRIMARY KEY (sid)
    );
    

    序列是执行此操作的另一种选择,但您需要 determine which one is proper 针对您的特定情况。阅读本文以获取更多信息comparing sequences to identity columns

    【讨论】:

    • 谢谢伊恩。这就是我开始的地方。我不确定为什么,但无论出于何种原因,此查询的“始终生成”部分都无法识别。我收到缺少正确括号的错误...表明它无法识别关键字。
    • 您运行的是什么版本的 DB2,在什么平台上运行?
    • 您在声明身份序列后缺少逗号 (','),但它在其他方面适用于 my DB2 部署(我尚未打开日志,不过,所以我现在不能声明主键)。
    • 如果您需要手动向列中插入一个值,您可以将 GENERATED ALWAYS 更改为 GENERATED BY DEFAULT。
    • @valijon 如果您想成为技术人员,它们实际上并不相同,因为 IDENTITY 是列的属性,就像 AUTO_INCREMENT 一样。 SERIAL 是一种伪类型,它指定列的类型及其属性。
    【解决方案2】:

    您必须使用序列对象创建一个自动递增字段(该对象生成一个数字序列)。

    使用以下 CREATE SEQUENCE 语法:

      CREATE SEQUENCE seq_person
      MINVALUE 1
      START WITH 1
      INCREMENT BY 1
      CACHE 10
    

    上面的代码创建了一个名为 seq_person 的序列对象,它从 1 开始并以 1 递增。它还将缓存多达 10 个值以提高性能。缓存选项指定将多少序列值存储在内存中以便更快地访问。

    要在“Persons”表中插入一条新记录,我们必须使用 nextval 函数(该函数从 seq_person 序列中检索下一个值):

      INSERT INTO Persons (P_Id,FirstName,LastName)
      VALUES (seq_person.nextval,'Lars','Monsen')
    

    上面的 SQL 语句会在“Persons”表中插入一条新记录。 “P_Id”列将被分配 seq_person 序列中的下一个数字。 “FirstName”列将设置为“Lars”,“LastName”列将设置为“Monsen”。

    【讨论】:

    • 虽然我承认 DB2 有序列,这是它们的一种用途(如果我没记错的话,自动生成列可能使用相同类型的对象),但 DB2 不是t 在该页面上列出...您是否只是复制了 Oracle 设置?请记住,Oracle 和 DB2 之间有几个 other 很大的差异(取决于版本),因此您不能盲目地复制。 (我认为我在这里发现人们对 w3schools 缺乏信心是有道理的:他们不仅缺少 DB2,还缺少 postgreSQL 和 Derby,所有这些都是常用的......也许比 Access 更多)
    • @Clockwork-Muse - 你是对的,虽然这种结构可以在 db2 中工作,但语法不同。
    【解决方案3】:

    嗨,如果您在创建表时仍然无法将列设为 AUTO_INCREMENT。作为一种解决方法,首先创建表:

    创建表学生( sid 整数 NOT NULL 名字 varchar(30), 主键 (sid) );

    然后显式尝试使用以下内容更改列 bu

    alter table student alter column sid set GENERATED BY DEFAULT AS 身份

    或者

    alter table student alter column sid set GENERATED BY DEFAULT 身份(以 100 开头)

    【讨论】:

      【解决方案4】:

      添加了一些用于创建“未来安全”序列的可选参数。

      CREATE SEQUENCE <NAME>
        START WITH 1
        INCREMENT BY 1
        NO MAXVALUE
        NO CYCLE
        CACHE 10;
      

      【讨论】:

        猜你喜欢
        • 2016-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-14
        相关资源
        最近更新 更多