【发布时间】:2011-02-16 12:14:33
【问题描述】:
我有大量行要复制,但我需要更改一个字段。
我可以选择要复制的行:
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 之外的列)。
【讨论】:
这是一个解决方案,您的表格中有许多字段,并且不想因输入所有字段而手指抽筋,只需输入所需的字段即可:)
如何将一些行复制到同一个表中,其中一些字段具有不同的值:
您的代码:
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 建议的那样)。
【讨论】:
TEMPORARY 关键字来创建临时表。当会话(一系列 SQL 查询)完成时,CREATE TEMPORARY TABLE 的使用将自动删除表。删除该表是不必要的,并且它不会与使用相同名称的其他临时表冲突。 (例如,当实时黑客(我不推荐))
ALTER TABLE temporary_table MODIFY <auto_inc_not_null_field> INT; 然后将主键更新为 Null 不会失败。
Exception: null value in column <auto_inc_not_null_field> violates not-null constraint。我试过ALTER TABLE temporary_table ALTER COLUMN <auto_inc_not_null_field> DROP NOT NULL;
假设您的表格还有另外两列:foo 和 bar
INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, "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
【讨论】:
嘿,如何复制所有字段,将其中一个更改为相同的值 + 其他值。
INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, Event_ID+"155"
FROM Table
WHERE Event_ID = "120"
????????????
【讨论】:
只要 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'
【讨论】: