【问题标题】:SQL Create Table that Auto-Increments one column based on another columnSQL 创建基于另一列自动增加一列的表
【发布时间】:2014-08-11 16:30:47
【问题描述】:

我还是 SQL 的初学者,所以请多多包涵。我需要创建一个存储表单信息的表。每个表单都有一个与之关联的 ID,它有两个部分。第一部分是 MMYY,第二部分是 5 位自增整数。示例 ID 为 0714-00001。并且每次更改月份时,5 位编号都应该重新开始。所以,我希望这些列看起来像这样:

订单号。 | Order_ID
----------------------------
0714         | 0001
0714         | 0002
0714         | 0003
0814         | 0001
0814         | 0002
0914         | 0001

当 SQL-Server 中的月份发生变化时,有什么方法可以让自动递增列重新开始递增?

我也环顾四周,很少有答案建议使用 PHP 来执行此操作,但是因为我使用的是 CMS,所以我无法输入自己的任何 PHP 脚本。

更新: 我最终只是在 CMS 站点中编写了一个 IF 语句,用于检查表单中输入的 order_no 是否与现有表中的 order_no 匹配。如果它们匹配,则将新行插入现有表中,如果它们不匹配,则将现有表中的所有数据复制到备份表中,然后将现有表截断,然后将新表插入。从而允许表再次从 1 重新开始计数。

【问题讨论】:

标签: sql sql-server primary-key auto-increment composite-primary-key


【解决方案1】:

也许您可以写一个after insert trigger,您可以在其中验证月份是否更改,然后相应地重新设置身份。我试图描述你的场景,下面是相同的示例代码

创建和插入语句

CREATE TABLE Table1
    ([Order_No] varchar(4), [Order_ID] int not null identity)
;

INSERT INTO Table1
    ([Order_No])
VALUES
    ('0714'),('0714'),('0714');

select * from table1;

创建触发器

create trigger trg_reseed on test.dbo.table1
after insert
as 
IF EXISTS (SELECT 1 FROM Table1 t1 
             JOIN inserted i ON t1.[Order_No] = i.[Order_No])
begin
DBCC CHECKIDENT (Table1, reseed, 1)
end

测试场景:

Identity 种子值没有变化,由于月份相同,它将递增到下一个值

INSERT INTO Table1
    ([Order_No])
VALUES
    ('0714');

由于插入月份不同,重新设置标识值

INSERT INTO Table1
    ([Order_No])
VALUES
    ('0914');

希望这能让您产生想法并开始使用。

【讨论】:

  • 非常感谢您的回答。但是我在这个解决方案中只看到一个问题。我将无法创建主键。如果只有 Order_ID 是主键,则不会发生重新播种,因为它不再是唯一编号。但我也无法创建复合主键,因为 Order_ID 列是自动递增的。
  • @user3694592,你部分正确;因为您确实可以创建一个复合键。同样,这个答案是根据您的帖子(您想要实现的)。如果您将 IDENTITY 列设置为 PK,那么您将永远无法重新设置它(这将违反 PK 约束)。现在,您可以选择您想要的方式。
  • 谢谢,我想我会删除主键。我最终将新的种子值更改为 0 以从 1 开始自动递增。谢谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2017-09-30
  • 2013-05-18
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-17
  • 2021-04-20
相关资源
最近更新 更多