【问题标题】:INSERT INTO table which requires a Join需要连接的 INSERT INTO 表
【发布时间】:2012-06-22 11:29:01
【问题描述】:

我目前正在尝试将数据从一个表移动到另一个表。在previous question I asked today 中,有人建议我使用插入语句。在尝试运行该语句时,我从 SQL Server 收到如下错误:

无法将值 NULL 插入“父”列、“*****.dbo.Product”表;列不允许空值。插入失败。

这是我创建的语句,

BEGIN TRANSACTION
INSERT INTO [*****].[dbo].[Product] 
([PDate]
  ,[SDate]
  ,[CreatedBy]
  ,[CreatedDate]
  ,[UpdatedBy]
  ,[UpdatedDate])
SELECT d.[PDate]
  ,d.[SDate]
  ,d.[CreatedBy]
  ,d.[CreatedDate]
  ,d.[UpdatedBy]
  ,d.[UpdatedDate]
FROM [*****].[dbo].[ProductData] AS d
JOIN [*****].[dbo].[Product] AS t
ON d.ProductDataID = t.ProductDataID
ROLLBACK TRANSACTION

我需要确保数据正确匹配

编辑:抱歉,我在复制脚本时出错。 UseDRM 在我原始脚本的两个部分中。 我要做的是将ProductData表中的数据复制到Product表中。

【问题讨论】:

  • select 子句中的某些列为空
  • 发布您的产品表设计
  • 我认为发生的事情是插入语句试图将新行添加到表中,而不是填充现有行。

标签: sql sql-server join insert-into


【解决方案1】:

Parent 列不可为空且没有默认值,因此您需要将其添加到查询中。

【讨论】:

  • 我已将这些新列添加到我的 Product 表中,并且我希望能够从 ProductDataID 匹配的 ProductData 中的数据中填充它们(两个表中都使用了 productDataID)
  • 除非您发布Product的定义,否则无法回答您的问题。
【解决方案2】:
BEGIN TRANSACTION
INSERT INTO [*****].[dbo].[Product] 
([PDate]
  ,[SDate]//Check Columns no here it is  6 total
  ,[CreatedBy]
  ,[CreatedDate]
  ,[UpdatedBy]
  ,[UpdatedDate])
SELECT d.[PDate] //Check columns numbers here it is 7 here 
  ,d.[SDate]
  ,d.[UseDRM]
  ,d.[CreatedBy] 
  ,d.[CreatedDate]
  ,d.[UpdatedBy]
  ,d.[UpdatedDate]
FROM [*****].[dbo].[ProductData] AS d
JOIN [*****].[dbo].[Product] AS t
ON d.ProductDataID = t.ProductDataID
ROLLBACK TRANSACTION

纠正它就可以了d.[UseDRM]不在插入中

【讨论】:

    【解决方案3】:

    尝试在选择查询中使用 ISNULL 来检查该值是否为空并将其替换为默认值。

    例如:

       BEGIN TRANSACTION
        INSERT INTO [*****].[dbo].[Product] 
        ([PDate]
          ,[SDate]
          ,[UseDRM]
          ,[CreatedBy]
          ,[CreatedDate]
          ,[UpdatedBy]
          ,[UpdatedDate])
        SELECT Isnull(d.[PDate], '1/1/1900')
          ,Isnull(d.[SDate], '1/1/1900')
          ,Isnull(d.[UseDRM], "")
          ,Isnull(d.[CreatedBy], "")
          ,Isnull(d.[CreatedDate], '1/1/1900')
          ,Isnull(d.[UpdatedBy], "")
          ,Isnull(d.[UpdatedDate], '1/1/1900')
        FROM [*****].[dbo].[ProductData] AS d
        JOIN [*****].[dbo].[Product] AS t
        ON d.ProductDataID = t.ProductDataID
        ROLLBACK TRANSACTION
    

    【讨论】:

    • 我不认为这会解决这个问题 - 错误消息说 Parent 列导致了问题,它根本不包含在 INSERT 语句中 .
    • 我同意,问题是 INSERT 没有引用目标表中的列,而该列需要一个值。
    【解决方案4】:

    我终于弄清楚我做错了什么,而不是使用 INSERT INTO 语句,我应该使用 UPDATE 语句

    UPDATE [********].[dbo].[Product] 
    SET [PDate] = [********].[dbo].[ProductData].[PDate]
      ,[SDate] = [********].[dbo].[ProductData].[SDate]
      ,[CreatedBy] = [********].[dbo].[ProductData].[CreatedBy]
      ,[CreatedDate] = [********].[dbo].[ProductData].[CreatedDate]
      ,[UpdatedBy] = [********].[dbo].[ProductData].[UpdatedBy]
      ,[UpdatedDate] = [********].[dbo].[ProductData].[UpdatedDate]
    FROM [********].[dbo].[ProductData], [********].[dbo].[Product]
    WHERE [********].[dbo].[Product].[ProductDataID] = [********].[dbo].[ProductData].[ProductDataID]
    

    对于我最初的问题写得不好,我深表歉意

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-06
      相关资源
      最近更新 更多