多个标识列或自动增加的方法

本文关键字:增加 方法 标识 | 更新日期: 2023-09-27 18:07:33

我有一个表(tOrder),在SQL Server 2008中具有以下结构

orderID (int) - this is currently the primary key and the identity field.
name(varchar)
address(varchar)
groupID (int) - now this field i need to also auto increment, but at the same time i want to be able to insert values into.

我的数据看起来像这样:

1 - john - address1 - 1
2 - mary - address2 - 1
3 - mary -address3 - 2
4 - jane - address4 - 3

其中订单id 1和2属于同一组,而订单id 3和4属于自己的组。

许多订单可以有相同的groupID,但是当我插入一个新组的订单时,我希望groupID自动使用下一个序列号自动填充,同时允许我为不同的订单插入重复的groupID,如果我需要的话。

希望这有意义。

我该怎么做呢?(我使用c#在后端,如果有任何区别)

多个标识列或自动增加的方法

我将创建一个具有标识的新"groups"表,以确保唯一性,如下所示:

create table tOrders(
    orderID int PRIMARY KEY IDENTITY,
    name varchar(30),
    address varchar(60),
    fkGroup int
);
create table tGroups(
    groupID int PRIMARY KEY IDENTITY,
    description varchar(50)
);
ALTER TABLE tOrders 
ADD FOREIGN KEY (fkGroup) REFERENCES tGroups(groupID);

当然,您必须为新插入的tGroup (groupID)值的IDENTITY提供groupID。

这个SQL Fiddle示例演示了填充表的一种方法。

一种选择是在torder表上创建一个触发器(不是触发器的粉丝,但考虑到您的标准,想不出其他选择)。

CREATE TRIGGER tOrder_trigger
   ON  tOrder
   AFTER INSERT
AS 
   UPDATE tOrder
   SET groupid = (SELECT COALESCE(MAX(groupid),0) + 1 FROM tOrder)
   FROM INSERTED AS I
   WHERE I.groupid IS NULL
   AND tOrder.orderid = I.orderid;

SQL Fiddle Demo

使用INSERTED检查插入的记录是否有NULL groupid,如果有,则将表更新为MAX(groupid) + 1,使用COALESCE检查NULL