【问题标题】:Insert table record with auto generate foreign id插入带有自动生成外部 id 的表记录
【发布时间】:2013-05-06 01:45:41
【问题描述】:

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

为了公平起见,每个员工将被自动分配到每个职责条目(记录)。所以每当我想插入一个职责条目时我应该怎么做,它会自动为它分配staffid(顺序)。

例子

  • 员工:1 员工姓名:Jack
  • 员工:2 员工姓名:玛丽

因此,当我为值班插入一个新条目(第一个条目)时,它将自动为值班表插入 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 

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

【问题讨论】:

  • 您是在问如何插入在另一个表中自动生成的值?
  • 随着STAFF 表的增长,您预计会发生什么?在问题中以表格形式包含示例数据和您想要的结果总是一个好主意。
  • 我上面提出的问题只是一个例子。 Branko,是的,我希望它在我插入新的值勤记录时自动生成 Staffid 外键。 HABO,我希望它会随着员工的加入而继续循环。谢谢

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


【解决方案1】:

试试这个:

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;

【讨论】:

  • 你可以使用任何@dutyname。
  • 我确实尝试过它并且效果很好,如果我有 2 列而不是 Staffid,那就是 StaffAssigned 和 StaffWorked,这两个列也都引用了 Staffid。那么我怎样才能在你上面写的第5行声明staffAsigned?谢谢
  • 我不明白“这两个列也都引用了 Staffid”。请给出实际的架构。
  • 员工表(staffid, staffname) 包含员工详细信息,它是 Duty 表 (dutyid, dutyname, staffAssigned, staffWorked) 的 FK,添加了名为 StaffAssigned 和 StaffWorked 的额外列,用于遏制 StaffAssigned 可能出现的问题无法参加工作,因此将由 StaffWorked 取代。这意味着 StaffAssigned 和 StaffWorked 实际上都指向 FK(staffid) 以了解那些被分配和工作的员工是谁。我想知道我应该如何在存储过程中声明 StaffAssigned=staffid 用于自动生成。谢谢
  • 如果分配的员工不可用,则将工作分配给其他员工。 StaffWorked 是如何被选中的?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    现在,随着每个新职责的插入,职责数量最少的工作人员将获得新职责插入。当然,如果员工分配不频繁,这种解决方案可能会导致一个问题,即在添加新员工时,他会暂时获得所有的职责分配。

    【讨论】:

    • 对不起,我是新来的,我可能需要进一步解释,如果我只想继续循环而不考虑最少使用的工作人员怎么样。你能告诉我存储过程格式并解释这样做吗?或它可能工作的任何其他格式。谢谢
    【解决方案4】:

    您可以使用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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-23
      • 1970-01-01
      • 2016-03-04
      • 1970-01-01
      相关资源
      最近更新 更多