louyok
2021-07-28 14:38
采纳率: 100%
浏览 43

数据库表格包含多个外键怎么处理呢?

现在有一个人员表,主键是工号

工号姓名
23张三
34李四

一个设备表格,主键是资产号

资产号设备名称
1示波器
2信号发生器

一个物料表格,主键是物料号

物料号物料名称
1电阻
2电容

现在要建立一个实验计划表格,主键是计划编号

计划编号责任人工号所需设备资产号所需物料的物料号
1231,21,2
2341,21,2

责任人、所需设备资产号、所需物料的物料号 都是外键。问题是所需设备可能有不止一个,所需物料也可能有不止一个,且个数不确定,该怎么处理呢?有人知道吗?

  • 好问题 提建议
  • 收藏

3条回答 默认 最新

  • 已采纳

    改变一下设计思路,用主从表实现(2个表),计划及责任人放在主表,设备及物料id放在明细表里面。

    已采纳该答案
    评论
    解决 无用 1
    打赏 举报
  • CSDN专家-Time 2021-07-28 14:45

    用function函数,把资产号和物料号转义成资产名称和物料名称。

    ALTER function [dbo].[GetDictionaryValue](@in nvarchar(255))
    returns nvarchar(255)
    as 
    begin
    -- 先决条件:D_Code组合必须是用','隔开
    -- 函数用途:可以将DictionaryValue表中的 任意D_Code字段 转化 成 D_Name 并使用逗号分割开。
        declare @out nvarchar(255) = '';
        declare @index int;
        declare @name nvarchar(255) = '';
        declare @code nvarchar(255);
        while(LEN(@in)>0)
            begin
                select @index = CHARINDEX(',', @in, 0); --找到第一个逗号
                    if(@index>0)
                        begin
                            set @code =Left(@in,@index-1);
                        end;
                    else
                        begin
                            set @code = @in;
                            set @index = LEN(@in);
                        end;
                set @in = RIGHT(@in,LEN(@in)-@index); --剩余部分
                select @name = D_Name from DictionaryValue where D_Code = @code;
                if(LEN(@out)=0)
                    set @out =@out + @name;
                else
                    set @out =@out +','+ @name;
                
            end;
        return @out;
    end;
    
    
    
    评论
    解决 无用
    打赏 举报
  • CSDN专家-Fay 2021-07-28 14:53

    这个属于多对多啊,设置外键存储不了1,2这样的数据
    将数据展开存储就行了,
    1 23 1 1
    2 23 1 2
    3 23 2 1
    4 24 2 2

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题