在MySQL中复制行

时间:2008-10-23 14:38:58

标签: mysql sql

我想复制一行的所有列,但不必指定每一列。我知道http://dev.mysql.com/doc/refman/5.1/en/insert-select.html的语法,但我认为无法忽略列。

对于我的示例,我尝试将行的所有列复制到新行,但主键除外。

有没有办法做到这一点,而无需用其中的每个字段编写查询?

7 个答案:

答案 0 :(得分:16)

如果您的id或主键列是auto_increment,则可以使用临时表:

CREATE TEMPORARY TABLE temp_table 
AS 
SELECT * FROM source_table WHERE id='7'; 
UPDATE temp_table SET id='100' WHERE id='7';
INSERT INTO source_table SELECT * FROM temp_table;
DROP TEMPORARY TABLE temp_table;

因此,您可以通过这种方式复制行id ='7'中的所有数据,然后分配 新值'100'(或任何值超出source_table中当前auto_increment值的范围)。

编辑:记住;在陈述之后:)

答案 1 :(得分:3)

如果您没有全部选择列,则需要列出要选择的列。复制/粘贴是你的朋友。

答案 2 :(得分:2)

这是我写的一个PHP脚本,它会假设你的第一个col是你的自动增量。

$sql = "SELECT * FROM table_name LIMIT 1"; 
$res = mysql_query($sql) or die(mysql_error());
for ($i = 1; $i < mysql_num_fields($res); $i++) {
     $col_names .= mysql_field_name($res, $i).", ";
 }
 $col_names = substr($col_names, 0, -2);

$sql = "INSERT INTO table_name (".$col_names.") SELECT ".$col_names." FROM table_name WHERE condition ";
$res = mysql_query($sql) or die(mysql_error());

答案 3 :(得分:1)

如果您没有指定列,则必须按顺序保留条目。例如:

INSERT INTO `users` (`ID`, `Email`, `UserName`) VALUES
(1, 'so@so.com', 'StackOverflow')

会工作但是

INSERT INTO `users` VALUES
('so@so.com', 'StackOverflow')

会将电子邮件放在ID列中,这样就不行了。

尝试编写一次列,如:

INSERT INTO `users` (`Email`, `UserName`) VALUES
('so@so.com', 'StackOverflow'),
('so2@so.com', 'StackOverflow2'),
('so3@so.com', 'StackOverflow3'),
etc...

我认为使用该方法可插入的行数有限制。

答案 4 :(得分:1)

不,这是不可能的。

但是很容易获得列列表,只删除你不想复制的列表,这个过程也可以通过代码等完成。

答案 5 :(得分:1)

将表复制到新表,然后删除不需要的列。简单。

答案 6 :(得分:0)

我假设你要省略主键,它是auto_increment列,你希望MySQL自动生成序列中的下一个值。

鉴于此,假设您不需要通过insert插入批量插入... select from方法,以下内容适用于单/多记录插入:

插入mytable(null,'a','b','c');

第一列是您的auto_incremented主键,其他列是您表中的其他列。当MySQL看到auto_incremented列的空(或0)时,它会自动将null替换为下一个有效值(有关详细信息,请参阅this link)。可以通过禁用该链接中描述的NO_AUTO_VALUE_ON_ZERO sql模式来禁用此功能。

如果您有任何问题,请与我们联系。

-Dipin