下午好,
我有一个数据库,用于跟踪装配线上的生产。
有效地,成品将显示生产线的每个stage
以及当前生产线的序列号。
我创建了一个存储过程来检索和显示这些数据,但我正在努力将机器从stage 1
移到stage 2
和stage 2
到stage 3
etc ...表非常简单,它包含以下行:
Stage_ID (PK, int, not null)
Build_ID(FK, int, null)
实际上,我想构建一个存储过程来将Build_ID
的值Stage_ID = 1
移动到Stage_ID = 2
。
知道怎么做吗?
由于
答案 0 :(得分:1)
update stageTable
set build_id = (select build_id from stageTable where stage_id = 1)
where stage_id = 2
如果你需要它作为一个程序,你可以做这样的事情
create procedure sp_moveStage(@from int, @to int)
as
update stageTable
set build_id = (select build_id from stageTable where stage_id = @from)
where stage_id = @to
并使用
执行它exec sp_moveStage 1, 2
答案 1 :(得分:0)
键不可变,因此您必须插入新行并删除旧行。不是你理想的设计。
P.S。如果StageID是您拥有的PK,则只能有一行StageID = 2:
Stage_ID (PK, int, not null) <<<---
Build_ID(FK, int, null)
你想要的是这样一个表:
create table process
(id int primary key,
buildid int not null,
stage int not null,
entrydatetime datetime,
exitdatetime datetime
)
显示构建何时进入并离开处理阶段。或者,如果阶段值可以以有意义的方式顺序排序,则可以通过假设下一阶段的输入时间来导出阶段退出的时间。
无论如何,你不想让像“过程中的阶段”这样的变化值成为PK。 Stage是更改值,构建的属性或属性,而PK是不可变实体标识符。
答案 2 :(得分:0)
这样的事可能有用。
第1步 - 获取构建ID的最大阶段ID并将其设置为变量。
第2步 - 向表中添加记录。 stage id将是步骤1中的变量加上1。
答案 3 :(得分:0)
ERM,
DECLARE @Build_ID int;
BEGIN TRANSACTION;
SELECT @Build_ID = Build_ID FROM SomeTable WHERE Stage_ID = 1;
UPDATE SomeTable SET Build_ID = @Build_ID WHERE Stage_ID = 2;
COMMIT TRANSACTION;