【问题标题】:Increment ID on insertion of a new row on database在数据库上插入新行时增加 ID
【发布时间】:2016-06-15 06:56:47
【问题描述】:

我需要一些我不知道是否可以实现的东西。基本上,我会将来自 java 的新信息行添加到具有表结构的数据库中,例如:

Number | Color | Size

   0   |  Red  | Big

   1   | Green | Small

   2   | Yellow| Medium

我正在使用 java,我只会输入颜色和大小,我想知道是否可以创建一个触发器,将变量 N​​umber(id) 存储在数据库端,并每次递增时间我在数据库中插入新行。我正在考虑执行类似“INSERT INTO table ((null),'Red', 'Big') 之类的操作,然后数据库将使用正确的 Number 更新该值。 也应该可以承认某些行可以删除,但它不会影响任何事情,例如:如果我有 ID 的 0 , 1 ,2 并且我删除了 1 ,下一行应该仍然是 3。

另外,我正在使用 Sybase SQL Anywhere 12 来执行此操作。

【问题讨论】:

  • 为 Sybase 查找 identity 列。

标签: java sql triggers insert increment


【解决方案1】:

您应该在数据库中使用自动增量列。

看这个。

http://www.sqlines.com/sybase-asa/autoincrement_identity

【讨论】:

    【解决方案2】:

    正如@Gordon Linoff 所说...

    身份列正在这样做,例如...

    create table T1 (ID int identity(1,1), Name nvarchar(100))
    

    在这种情况下,你会去......

    insert into T1 (Name) values ('John')
    

    因此,您将插入名称“John”,DB 本身会给他 ID 1 下次插入时,ID 2 将被设置……依此类推……

    Identity(1,1) - it means start from 1 and increment it by 1 on new insert
    

    关于这个的事情是,一旦取了数字,就没有回头路了,所以如果你有 ID 1、2、3 .. 并删除 ID 3 .. 下一次插入 ID 将上升到 4,它不会填充“缺失的号码”

    【讨论】:

    • 感谢您的意见,不过我想问一下,如果我还有一列,例如 ID、姓名和年龄,我将如何处理?更具体地说,插入查询,我想不通编辑:毕竟只是想通了嘿嘿..会是这样的:插入T1(姓名,年龄)值('John' ,'20')
    • 干得好,伙计!作为标识的列,您永远不会放入插入语句,因为它们是自增的。祝你好运
    【解决方案3】:

    有几种解决方案可以满足您的要求,但它们在几个方面有所不同,您应该决定选择最好的一种。

    一些解决方案存在于数据库上下文中。 (例如@Gregory 回答), 但其他一些解决方案与数据库类型和特定功能无关。这意味着您可以独立于您的数据库类型来实现您的解决方案,并且您可以更改您的数据库(oracle、sql-server、my-sql,...),并且无需更改您的 java 代码。 在 jpa 中,使用 @GeneratedValue 解决此问题的三种序列策略。

    1) 表排序:您在数据库中为此目的使用单独的表。此表为具有此策略的自动增量列的其他表保存正确的 id。

    2) 序列对象:您在数据库中使用序列对象并由 jpa 处理它。仅在某些数据库中支持序列对象,例如 Oracle、DB2 和 Postgres。

    3) 标识排序:在数据库中使用特殊的 IDENTITY 列,以允许数据库在插入行时自动为其分配一个 id。许多数据库都支持标识列,例如 MySQL、DB2、SQL Server、Sybase 和 PostgreSQL。 Oracle 不支持 IDENTITY 列,但可以使用序列对象和触发器来模拟它们。

    如果你想独立于你的db类型,我建议你在jpa中使用“table strategy”。

    详情请参阅Java Persistence/Identity and Sequencing

    你问:

    我想知道是否可以创建一个触发器 将变量 N​​umber(id) 存储在数据库端,并递增它 每次我在数据库中插入一个新行。

    是的,您可以使用触发器,但正如我提到的,有一些更简单的解决方案,而不是它。

    也应该可以暴露一些行可以是 已删除,但不会影响任何事情

    在 jpa 解决方案中,已删除的 id 不会在下次使用时使用,但如果您实施自己的解决方案,您可以使用它们。

    我希望这个答案对你有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-03
      • 1970-01-01
      • 2016-10-16
      • 1970-01-01
      • 2020-10-08
      • 2016-04-22
      相关资源
      最近更新 更多