【问题标题】:Insert into sql database one to many relationship插入sql数据库一对多关系
【发布时间】:2026-02-09 02:35:01
【问题描述】:

如果有人能帮我解决这个问题,我将不胜感激。我在将记录插入一对多关系数据库时遇到问题。场景如下,我有一个技术人员表(techid,name,surname)和一个技能表(skillid,skillDesc,techid)。技能表有一个 techID 外键。

如何创建一个 sql 语句/程序来插入具有分配给技术人员的多种技能的技术人员?

【问题讨论】:

  • 到目前为止你有什么?
  • 技术人员中的 techid 是身份 (auot inc) 列吗?
  • 您是否遇到了具体问题?所写的问题看起来很笼统。在 sql-server 中插入的 MS 文档是 msdn.microsoft.com/en-us/library/aa933206%28v=sql.80%29.aspx
  • 你必须先插入到技术表,然后是技能表。你也许可以做一些时髦的多表插入,但这可能太花哨了
  • 这个问题在我看来:如何将多项技能传给一名技术人员到存储过程。我自己也不知道,但也奇怪为什么不一一做。插入技术员,然后一一插入技能表。

标签: sql sql-server stored-procedures


【解决方案1】:

我认为你应该有三个表:Technician(techid, name, surname)、Skill(skillid, SkillDesc) 和Ability(skillid, techid)。如果您只有两个表,则技能到技术人员的每个映射都必须包含技能描述的副本,这是冗余信息。相反,您希望使用表来定义 Technician 对象和 Skill 对象,并使用第三个表来捕获它们之间的关系。

首先执行这个查询:

insert into technician values (my_id, my_name, my_surname)

然后循环遍历技能(伪代码):

for skill in skills:
    insert into Ability values(skill, my_id)

【讨论】:

    【解决方案2】:

    您需要三个表 Technician、Skill 和 TechnicianSkill。使用两个表,您不能将多个技能分配给单个技术人员。 (如果 TechID 和 SkillID 是主键)

    Technician Table:
    Columns: TechID, Name, SurName
    
    Skill Table:
    Columns: SkillID, SkillDesc
    
    -- Put the TechID and SkillID as a foreign key in this table
    TechnicianSkill Table:
    Columns: TechID, SkillID 
    -- You can make a primary key by using the two columns (TechID,SkillID) 
    

    【讨论】:

    • 这对于多对多来说是必要的。一对多不需要。从组织上讲,这是执行此操作的方法,因为您将引用单个技能,而不必每次都输入相同的描述。另外,不要忘记约束。
    • 为什么在 TechSkill 表中包含第三列 TechSkillId?只需让表格包含TechIDSkillId。这两个字段将是表上的自然键。
    • 感谢您的帖子,但它认为我的问题相当模糊。我遇到的问题是,当“用户”添加技术人员时,他可以为技术人员分配多个技能。如果按下“插入技术人员”。然后程序应该调用一个插入过程,然后插入具有分配给技术人员的所有技能的技术人员。但是我面临的问题是实际上将技术人员和技能同时插入到数据库中,如果发生错误,事务应该回滚。
    • @MarcelPalm 您必须发布您的代码,以便我们为您提供帮助
    • 目前我可以插入一名技术人员,该技术人员具有多种技能,但如果由于某种原因发生错误,则只能完成部分交易。所以我面临的问题是编写一个存储过程,它将插入技术人员,获取技术人员 ID(使用最大值),然后插入分配给技术人员的技能,如果某处出现问题,那么事务应该回滚,什么都不应该插入。