使用auto生成外部id插入表记录

时间:2013-05-06 01:45:41

标签: sql sql-server sql-server-2008

我有一个名为DUTY的表(列:dutyid, dutyname, staffid)和一个名为STAFF的表(列:staffid, staffname

为了公平起见,每名工作人员将自动分配到每个职责录入(记录)。那么每当我想插入一个职责条目时,我该怎么办呢,它会为它自动分配staffid(顺序)。

实施例

  • staffid:1名员工:杰克
  • staffid:2名工作人员:Mary

因此,当我插入一个新条目(第一个条目)时,它将自动插入staffid = 1作为职责表。对于第二次输入,staffid将为2。

对于以下条目,它将继续循环staffid

期望的答案:

dutyid   dutyname   staffid 
  1      cleaning     1 
  2      cleaning     2 
  3      cleaning     1 
  4      cleaning     2 
  5      cleaning     1 
  6      cleaning     2 
  7      cleaning     3       new staff
  8      cleaning     1 
  9      cleaning     2 
 10      cleaning     3 

任何人都可以向我展示并解释我在存储过程中应该做些什么...... 感谢

4 个答案:

答案 0 :(得分:0)

请参阅sqlfiddle

此查询将返回下一个员工编号并循环回到第一个

SELECT max(staffid) FROM 
(
  SELECT top 1 staff.staffid
  FROM staff, (
   SELECT top 1 staffid
   FROM duty
   ORDER BY id DESC
  ) d
  WHERE staff.staffid > d.staffid
  Order by staff.staffid
 UNION
  SELECT top 1 staffid 
  FROM staff
  ORDER BY staffid
) x

答案 1 :(得分:0)

另一种方法是使用职责表来获得下一个分配最少的工作人员。

select top 1 staffID,count(*)
from duty
group by StaffId
order by 2

现在,随着每项新职责的插入,职责最少的职员获得新的职责。当然,如果不经常分配工作人员,这个解决方案可能会导致一个问题,即当添加新的工作人员时,他会在一段时间内完成所有的工作任务。

答案 2 :(得分:0)

您可以使用SCOPE_IDENTITY获取上次自动生成的ID:

declare @last_id int

-- assumes staffid is an auto generated key (identity)
insert into STAFF (staffname) 
values ('JACK')

select @last_id = SCOPE_IDENTITY()

insert into DUTY (dutyid, dutyname, staffid)
values (1, 'duty-name-jack', @last_id)

insert into STAFF (staffname) 
values ('MARY')

select @last_id = SCOPE_IDENTITY()

insert into DUTY (dutyid, dutyname, staffid)
values (2, 'duty-name-mary', @last_id)

答案 3 :(得分:0)

试试这个:

select * from duty;

Declare @dutyname varchar(20)='cleaning'
Declare @staffid int
Declare @maxstaffid int

select @staffid=staffid from duty
where dutyid=
(select max(dutyid) from duty);


select @maxstaffid=max(staffid) from staff;

print @maxstaffid;


insert into duty (dutyname, staffid)
select @dutyname,
case
  when @staffid=@maxstaffid then (select min(staffid) from staff)
  else (select min(staffid) from staff where staffid>@staffid)
end ;

select * from duty;