Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL创建基于另一列自动递增一列的表_Sql_Sql Server_Primary Key_Auto Increment_Composite Primary Key - Fatal编程技术网

SQL创建基于另一列自动递增一列的表

SQL创建基于另一列自动递增一列的表,sql,sql-server,primary-key,auto-increment,composite-primary-key,Sql,Sql Server,Primary Key,Auto Increment,Composite Primary Key,我还是SQL的初学者,所以请耐心听我说。我需要创建一个存储表单信息的表。每个表单都有一个与之关联的ID,该ID由两部分组成。第一部分是MMYY,第二部分是一个5位数的自增整数。示例ID是0714-00001。每次月份变化时,5位数字的编号都应该重新开始。所以,我想让这些列看起来像这样: 订单号|订单ID------------------------------- 0714 | 0001 0714 | 0002 0714 | 0003 0814 | 0001 0814 | 0002 0914 |

我还是SQL的初学者,所以请耐心听我说。我需要创建一个存储表单信息的表。每个表单都有一个与之关联的ID,该ID由两部分组成。第一部分是MMYY,第二部分是一个5位数的自增整数。示例ID是0714-00001。每次月份变化时,5位数字的编号都应该重新开始。所以,我想让这些列看起来像这样:

订单号|订单ID
-------------------------------
0714 | 0001
0714 | 0002
0714 | 0003
0814 | 0001
0814 | 0002
0914 | 0001

有没有办法让自动递增列在SQL Server中的月份发生变化时重新开始递增

我也环顾四周,很少有人建议使用PHP来实现这一点,但因为我使用的是CMS,所以我无法输入任何自己的PHP脚本

更新:
最后,我在CMS网站上写了一条IF语句,说明表单中输入的订单号是否与现有表中的订单号匹配。如果它们匹配,新行将插入到现有表中,如果它们不匹配,现有表中的所有数据将复制到备份表中,现有表将被截断,然后插入新行。因此,允许表再次在1处重新开始计数

您可能可以在插入触发器后编写一个
验证月份是否更改,然后相应地重新设定标识。我试图描述您的场景,下面是相同场景的示例代码

创建和插入语句

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
测试场景:

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

INSERT INTO Table1
    ([Order_No])
VALUES
    ('0714');
重新设定自插入月份以来的标识值的种子

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

希望这能让您了解情况并开始使用。

安排a在指定的时间间隔内跑步。让它在该列上执行一次重新设置id。非常感谢您的回答。但我认为这个解决方案只有一个问题。我将无法创建主键。如果只有Order_ID是主键,则不会进行重新播种,因为它不再是唯一的数字。但我也不能创建复合主键,因为Order_ID列是自动递增的。@user3694592,部分正确;因为你确实可以创建一个复合键。同样,这个答案是根据你的帖子(你想要达到的)。若您将标识列设为PK,那个么您永远不能为其重新设定种子(这将违反PK约束)。现在你可以选择怎么走了。谢谢你,我想我还是把主键放下吧。最后,我将新的重新设定种子的值更改为0,以获得从1开始的自动增量。谢谢你的帮助!