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

时间:2013-04-05 00:04:38

标签: c# asp.net sql sql-server-2008

我有一个表(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共享同一个组,而3和4组合在一起。

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

希望这是有道理的。

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

2 个答案:

答案 0 :(得分:2)

我会创建一个新的"组"具有身份的表以确保唯一性如下:

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 Example演示了一种填充表格的方法。

答案 1 :(得分:0)

一个选项是在你的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

这将检查插入的记录是否具有使用NULL的{​​{1}} groupid,如果是,则使用INSERTED将表更新为MAX(groupid) + 1以检查{{ 1}}。