【问题标题】:Why is 'insert into select' statement in SQL inserting as a new row and not inserting correctly?为什么 SQL 中的“insert into select”语句作为新行插入而不正确插入?
【发布时间】:2020-04-23 12:55:15
【问题描述】:

我有表 1。

我还有另一个空表 2,其中包含以下列。

我想通过从表 1 中选择来插入表 2 - 所以我将查询编写为:

insert into table2(employee,id,zone,url) 
select employee, id, zone, concat('https://',employee,'.com/',id,'?',zone) 
from table1

现在我的表 2 是这样的,

现在对于 authcode 列,我执行以下操作并将其插入到 table2 中。

insert into table2(authcode) 
SELECT CONVERT(VARCHAR(10),HASHBYTES('MD5', substring(URL,8,100)),2) 
from table2.

但是插入的发生方式不同,就像这样作为一个完整的新行集。

有人可以帮我将最后一列插入相应的行而不是创建一个新行吗?

【问题讨论】:

  • 因为这就是 INSERT 所做的——它插入新行。如果要更新现有行,请使用 UPDATE。

标签: sql sql-server database sql-insert


【解决方案1】:

您应该做的是更新表格以填充列authcode,但您可以在插入行时一步完成:

insert into table2(employee,id,zone,url, authcode) 
select 
  employee, 
  id, 
  zone, 
  concat('https://',employee,'.com/',id,'?',zone),
  CONVERT(VARCHAR(10),HASHBYTES('MD5', substring(concat('https://',employee,'.com/',id,'?',zone),8,100)),2) 
from table1

或者如果你想更新:

update table2
set authcode = CONVERT(VARCHAR(10),HASHBYTES('MD5', substring(URL,8,100)),2) 
where authcode is null 

【讨论】:

  • 谢谢你,精彩的解释。
【解决方案2】:

您看到的结果是INSERT 语句的预期行为。它总是会插入新行。

如果您想修改现有行,您需要使用UPDATE 语句。

您可以修改您的 INSERT 以使其看起来像 @forpas 发布的内容,以便一步完成所有这些工作。另一种选择是将第二个 INSERT 修改为 UPDATE,如下所示:

update table2
set authcode = CONVERT(VARCHAR(10),HASHBYTES('MD5', substring(URL,8,100)),2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-21
    • 2016-05-04
    • 2019-01-24
    • 2011-02-07
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多