我有大量的行,我想复制,但我需要改变一个字段。
我可以选择我想要复制的行:
select * from Table where Event_ID = "120"
现在我想复制所有这些行并创建新行,同时将Event_ID设置为155。我怎样才能做到呢?
我有大量的行,我想复制,但我需要改变一个字段。
我可以选择我想要复制的行:
select * from Table where Event_ID = "120"
现在我想复制所有这些行并创建新行,同时将Event_ID设置为155。我怎样才能做到呢?
INSERT INTO Table
( Event_ID
, col2
...
)
SELECT "155"
, col2
...
FROM Table WHERE Event_ID = "120"
这里,col2,…表示表中剩下的列(Event_ID以外的列)。
假设你的表有另外两列:foo和bar
INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, "155"
FROM Table
WHERE Event_ID = "120"
嘿,复制所有字段如何,将其中一个更改为相同的值+其他值。
INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, Event_ID+"155"
FROM Table
WHERE Event_ID = "120"
? ? ? ? ? ? ? ? ? ?
如果你的表中有很多列,你不想把每一列都打出来,你可以用一个临时表来做,比如;
SELECT *
INTO #Temp
FROM Table WHERE Event_ID = "120"
GO
UPDATE #TEMP
SET Column = "Changed"
GO
INSERT INTO Table
SELECT *
FROM #Temp
这是一个解决方案,你在你的表中有很多字段,不想从输入所有字段中得到一个手指抽筋,只输入需要的:)
如何将一些行复制到同一个表中,其中一些字段具有不同的值:
创建一个包含要复制的所有行的临时表 用所需的值更新临时表中的所有行 如果您有一个自动递增字段,您应该在临时表中将其设置为NULL 将临时表的所有行复制到原始表中 删除临时表
你的代码:
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所建议的那样)。
只要Event_ID为Integer,执行以下操作:
INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, (Event_ID + 155)
FROM Table
WHERE Event_ID = "120"
补充一下@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'
如果你不介意在你的代码中这样做,它会更容易做到。例如,在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);
}
使用函数是可选的。我做这个是因为我需要做几次。我使用这个选项是因为如果将来数据库列发生更改,我可以忘记它。