【问题标题】:How do I select insert into select a table which already has values in the primary key column without adding new rows?如何在不添加新行的情况下选择插入来选择主键列中已有值的表?
【发布时间】:2018-10-23 07:02:21
【问题描述】:

我正在为我的学校项目开发一个数据库,我必须通过规范化提供给我们的示例表来生成一个功能数据库。 我遇到麻烦的一张桌子是行程。我从规范化中生成 3 个表,它们是“目的地”、“路线”和“路线目的地”。

目的地的代码是:

create table Destinations
(
 DestinationID varchar(5) primary key,
 Name varchar(45)
 );

行程代码为:

create table Itineraries
(
 ItineraryID varchar(5),
 Name varchar(45)
 );

最后一张表的代码是:

create table Itinerary_Destinations
(
DI varchar(5) primary key,
ItineraryID varchar(5) foreign key references Itineraries(ItineraryID),
Itinerary_Name varchar(45),
DestinationID varchar(5) foreign key references Destinations(DestinationID),
Destination_Name varchar(45)
);

除“Destination_Name”和“Itinerary_Name”列外,已将数据插入到所有 3 个表中。我尝试使用的代码作为错误返回。代码如下所示。

insert into Itinerary_Destinations (Itinerary_name)
select Name from Itineraries where 
Itineraries.ItineraryID = ItineraryID;

它返回的错误是

消息 515,级别 16,状态 2,第 1 行无法将值 NULL 插入 列“DI”,表“DDDAssignment.dbo.Itinerary_Destinations”;柱子 不允许空值。插入失败。声明已终止。

有没有一种方法可以在不创建需要主键的新记录的情况下完成插入 Destination_Name 和 Itinerary_Name 的任务?

还是我应该手动操作?

【问题讨论】:

    标签: sql sql-server database ssms


    【解决方案1】:

    如果你想修改已经存在的记录,那么你应该使用UPDATE而不是INSERT

    UPDATE a
    SET Itinerary_name = b.Name
    FROM Itinerary_Destinations a
    INNER JOIN Itinerary_name b
        ON a.ItineraryID = b.ItineraryID;
    

    但是,如果您确实有一些尚未与Itinerary_Destinations 表逻辑关联的数据,那么使用插入是合适的。

    【讨论】:

    • 非常感谢,我没想到。我觉得很傻。
    【解决方案2】:

    使用 coalesce 函数以防 null 它将插入空白字符串,因为您的列不允许空值,这就是您在查询中遇到该错误的原因

    insert into Itinerary_Destinations (Itinerary_name)
    select  coalesce(Name,' ') from Itineraries where 
    Itineraries.ItineraryID = ItineraryID;
    

    【讨论】:

    • 谢谢,我试试
    猜你喜欢
    • 2020-07-18
    • 2015-01-16
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 2015-10-27
    • 1970-01-01
    相关资源
    最近更新 更多