从没有PRIMARY KEY sql server的其他表中使用PRIMARY KEY向表中插入行

时间:2019-12-07 08:41:38

标签: sql-server

我希望能很好地解释我的问题

我有一个带有主键的新表。

如何从不同的表插入表? 我的问题是一个没有主键的表,我不知道如何从表的第一行中选择并插入到新表中。

示例-

新表1 image

  • AssetId是主键

表2 image

  • 我需要在表1中插入一行

表3 image

我的脚本-

insert AssetBusStops (AssetId,StopCode,StopId,Description,ZoneId)
select  Assets.Id,stops_ppp.stop_code,stops_ppp.stop_id,stops_ppp.stop_desc,stops_ppp.zone_id from Assets inner join stops_ppp 
on Assets.AssetCode = stops_ppp.stop_code 
  

例外-

     

第2级第1州第11行2627消息   违反主键约束'PK_AssetBusStops'。无法在对象'dbo.AssetBusStops'中插入重复键。重复键值为(2763)。   该声明已终止。

2 个答案:

答案 0 :(得分:1)

20001的列AssetCode的值Assets与表stops_ppp的3行匹配,结果联接查询中的这3行具有相同的值2763列中的id
因此,您的查询尝试插入3行,而不仅仅是1行,这将在主键中创建重复项,这是不允许的。
您应该在查询结果中应用过滤器,例如:

insert AssetBusStops (AssetId,StopCode,StopId,Description,ZoneId)
select top 1 ASsets.Id, 
  stops_ppp.stop_code, stops_ppp.stop_id, stops_ppp.stop_desc, stops_ppp.zone_id 
from Assets inner join stops_ppp 
on Assets.AssetCode = stops_ppp.stop_code 
order by stops_ppp.stop_code

(对于您的示例数据)此表仅返回1行(按注释中的要求,为任意行),并且可以安全地插入。

答案 1 :(得分:0)

A)如果您没有FK可以列出AssetBusStops:

  1. 将“ PK列”更改为IDENTITY(1,1)
  2. 从“插入”脚本中删除PK值

B)如果您有FK可以列出AssetBusStops: 尝试使用不存在或合并