MySQL:如何复制行,但更改一些字段?

p5fdfcr1  于 2022-12-17  发布在  Mysql
关注(0)|答案(8)|浏览(156)

我有大量的行要复制,但我需要更改一个字段。
我可以选择要复制的行:

select * from Table where Event_ID = "120"

现在我想复制所有这些行并创建新行,同时将Event_ID设置为155

kr98yfug

kr98yfug1#

INSERT INTO Table
          ( Event_ID
          , col2
           ...
          )
     SELECT "155"
          , col2
           ...
      FROM Table WHERE Event_ID = "120"

这里,col2,...表示表中的其余列(**Event_ID以外的列)。

ftf50wuq

ftf50wuq2#

如果您的表中有许多字段,并且不想在键入所有字段时手指抽筋,则只需键入所需的字段即可:)

如何将一些行复制到同一个表中,其中一些字段具有不同的值:

1.创建包含所有要复制的行的临时表
1.使用所需的值更新临时表中的所有行
1.如果有自动增量字段,则应在临时表中将其设置为NULL
1.将临时表中的所有行复制到原始表中
1.删除临时表

您的密码:

CREATE table temporary_table AS SELECT * FROM original_table WHERE Event_ID="155";

UPDATE temporary_table SET Event_ID="120";

UPDATE temporary_table SET ID=NULL;

INSERT INTO original_table SELECT * FROM temporary_table;

DROP TABLE temporary_table;

一般方案代码:

CREATE table temporary_table AS SELECT * FROM original_table WHERE <conditions>;

UPDATE temporary_table SET <fieldx>=<valuex>, <fieldy>=<valuey>, ...;

UPDATE temporary_table SET <auto_inc_field>=NULL;

INSERT INTO original_table SELECT * FROM temporary_table;

DROP TABLE temporary_table

简化/压缩代码:

CREATE TEMPORARY TABLE temporary_table AS SELECT * FROM original_table WHERE <conditions>;

UPDATE temporary_table SET <auto_inc_field>=NULL, <fieldx>=<valuex>, <fieldy>=<valuey>, ...;

INSERT INTO original_table SELECT * FROM temporary_table;

由于临时表的创建使用了TEMPORARY关键字,因此会话结束时会自动删除该表(如@ar34z所建议)。

8cdiaqws

8cdiaqws3#

假设您的表还有另外两列:餐饮酒吧

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, "155"
  FROM Table
 WHERE Event_ID = "120"
epggiuax

epggiuax4#

如果您的表中有很多列,并且不想键入每一列,则可以使用临时表来完成,例如;

SELECT *
INTO #Temp
FROM Table WHERE Event_ID = "120"
GO

UPDATE #TEMP
SET Column = "Changed"
GO

INSERT INTO Table
SELECT *
FROM #Temp
4uqofj5v

4uqofj5v5#

嘿,复制所有字段,将其中一个字段更改为相同的值+其他内容如何?

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, Event_ID+"155"
  FROM Table
 WHERE Event_ID = "120"

??????????

ocebsuys

ocebsuys6#

只要Event_ID为整数,请执行以下操作:

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, (Event_ID + 155)
  FROM Table
WHERE Event_ID = "120"
qaxu7uf2

qaxu7uf27#

加上@DaveTheBFG的回答:如果您有标识列(以下示例中的“Table_PK”),INSERT行将失败,但您可以执行以下操作(特定于SQL Server,但此概念可能适用于其他数据库):

SELECT *
INTO #Temp
FROM Table WHERE Event_ID = "120"

UPDATE #TEMP
SET Column = "Changed"

ALTER TABLE #TEMP DROP COLUMN Table_PK

EXEC sp_executesql N'INSERT INTO Table SELECT * FROM #Temp'
jvidinwx

jvidinwx8#

如果你不介意在你的代码中做,这会更容易。例如,在php中你可以做

function copyQuery($table, $row){
    $queryColumns = $queryValues = '';
    foreach ($row as $key => $value) {
        $queryColumns .= $key.', ';
        $queryValues .= "'$value', ";
    }
    $queryColumns = rtrim($queryColumns, ', ');
    $queryValues = rtrim($queryValues, ', ');

    return "INSERT INTO $table ($queryColumns) VALUES ($queryValues)";
}

$records = mysqli_query($connect, "SELECT * FROM Table WHERE Event_ID = 120");
while ($row = mysqli_fetch_assoc($records)) {
    unset($row['id']);
    $row['Event_ID'] = 155;

    $query = copyQuery('Table', $row);
    mysqli_query($connect, $query);
}

使用函数是可选的。我这样做是因为我需要这样做几次。我使用这个选项是因为现在如果数据库列在未来发生变化,我可以忘记它。

相关问题