SQL 从同一个表中复制行并更新 ID 列

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3770012/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-01 07:37:48  来源:igfitidea点击:

Copy rows from the same table and update the ID column

sqlsql-server

提问by kalls

I have the following table

我有下表

alt text

替代文字

I have inserted Product B to it and it gives me an ID of 15

我已将产品 B 插入其中,它给我的 ID 为 15

Then I have the definition table which is as follows.

然后我有如下的定义表。

alt text

替代文字

I want to select the ProductDefinition rows where ProdID = 14 and replicate the same and insert it for ProdID = 15 like the following

我想选择 ProdID = 14 的 ProductDefinition 行并复制相同的行并将其插入 ProdID = 15,如下所示

alt text

替代文字

How to achieve this using SQL code?

如何使用 SQL 代码实现这一点?

回答by Blrfl

INSERT INTO ProuctDefinition (ProdID, Definition, Desc)
SELECT
  xxx, Definition, Desc
FROM
  ProductDefinition
WHERE
  ProdID = yyy

The xxxis your new ProdID and the yyyis your old one. This also assumes that DefIDis automagically populated on INSERT.

xxx是你的新的ProdID和yyy是你的旧的。这也假设DefID是在 上自动填充的INSERT

回答by Donald Powell

This will work with any column you choose. Not just primary key/ID.

这将适用于您选择的任何列。不仅仅是主键/ID。

INSERT INTO TableName (Column1, CustomID, Column3, Column4, Column5)
SELECT Column1, 'NewValue', Column3, Column4, Column5 FROM TableName
WHERE CustomID='OrigValue'

回答by onedaywhen

Can use MERGEon SQL Server 2008, has the advantage of using OUTPUTto return the DefIDvalues, assuming they are auto-generated e.g.

可以MERGE在 SQL Server 2008 上使用,具有OUTPUT用于返回DefID值的优点,假设它们是自动生成的,例如

MERGE INTO ProductDefinition
USING (
       SELECT 16, P1.Definition, P1.Description
         FROM ProductDefinition AS P1
        WHERE P1.ProdID = 15
      ) AS source (ProdID, Definition, Description)
ON 0 = 1
WHEN NOT MATCHED THEN
   INSERT (ProdID, Definition, Description)
   VALUES (ProdID, Definition, Description)
   OUTPUT inserted.DefID, inserted.ProdID, 
             inserted.Definition, inserted.Description;

回答by Ahmed Elzeiny

if you want to select all items (in condition the table not contains any primary keys)

如果要选择所有项目(条件是表不包含任何主键)

INSERT INTO [tabelName]
SELECT  * FROM    [tabelName]
WHERE  (YourCondition)

in condition the table contains a primary keys, select only the columns that not primary key Like:

在表包含主键的情况下,只选择不是主键的列,例如:

INSERT INTO [tabelName]
SELECT  col_1,col_2,col_n FROM    [tabelName]
WHERE  (YourCondition)

回答by Divya

If you want to replicate data in same table use this logic:

如果要复制同一个表中的数据,请使用以下逻辑:

first, insert statment where you want to insert...

首先,在要插入的地方插入语句...

insert into [table](column1,column2)

second, select statment from where you want to take data for insertion....

其次,从要插入数据的位置选择语句....

select (column1/'your value',column2/'your value') from [table]

now set filter which rows you want to duplicate

现在设置过滤器要复制的行

where (your condition)

as want to replicate same data for different customers i have used this query.

因为想为不同的客户复制相同的数据,我使用了这个查询。

回答by Prabin Poudel

If your id is not autoincrement or declared sequence and if u dont want to create a temporary table:

如果您的 id 不是自动增量或声明的序列,并且您不想创建临时表:

you can use:

您可以使用:

INSERT INTO Tabel1 SELECT ((ROW_NUMBER( ) OVER ( ORDER BY ID  )) + (SELECT  MAX(id) FROM Table1)) ,column2,coulmn3,'NewValue' FROM Tabel1 Where somecolumn='your value`

回答by Franta

Do you use Oracle? It does not have an automatic PK_generator, nothing to work for your INSERTsilently. However, it has SEQUENCEs, so let's use its NEXTVAL:

你使用甲骨文吗?它没有自动 PK_generator,没有什么可以INSERT默默地为您工作。但是,它有序列,所以让我们使用它NEXTVAL

INSERT INTO Orders_tab (Orderno, Custno)
    VALUES (Order_seq.NEXTVAL, 1032);

The INSERT operation is exactly the case for them, the purpose of a SEQUENCE, you just have to use it explicitly. More described: Managing Sequences # Using Sequences

INSERT 操作正是他们的情况, a 的目的SEQUENCE,您只需要显式使用它。更多描述:管理序列 # 使用序列

The node for Sequences is on the level of Tables, i.e. in the SQLdeveloper. Ours are ID_GENERATOR, in every DB.

Sequences 的节点位于 Tables 级别,即在 SQLdeveloper 中。我们的是ID_GENERATOR,在每个数据库中。