我们可以根据它的ID简单地复制数据库中的条目,而不必提及要复制的该行的所有字段名称。
我有一行看起来像
id name last city state whatever
1 joe doe xyz NY yyy
我想复制一份。 id
是自动增量。最简单的方法是什么?
答案 0 :(得分:2)
显示您正在做的最明确的方法是明确命名列。这样可以确保您获得所需的功能,并且对于必须在您之后修改此代码的任何人都可以清楚。
INSERT INTO yourTable(name, last, city, state, whatever)
SELECT name, last, city, state, whatever
FROM yourTable
WHERE id = 1
如果您确实希望由于未知字段而动态插入记录,则需要使用来自INFORMATION_SCHEMA.COLUMNS的动态SQL和数据,并在循环或类似结构中自行构建字段名称。
答案 1 :(得分:2)
如果您不想列出必须使用information_schema和预习语句播放的所有字段。
这是一个例子
set @str = (select concat('insert into ', table_name,' (', group_concat(column_name),')',' select ',group_concat(column_name),' from ', table_name, ' where id = 1') from
information_schema.columns
where table_schema = 'your_db' and table_name = 'your_table'
and column_key <> 'PRI');
prepare stmt from @str;
execute stmt;
deallocate prepare stmt;
您甚至可以在存储过程中转换它,以这种方式传递三个参数(id,表名和数据库名称):
delimiter //
drop procedure if exists copy_record //
create procedure copy_record(in my_id int, in my_db varchar(50), in my_table varchar(50) )
begin
set @str = (select concat('insert into ', table_name,' (', group_concat(column_name),')',' select ',group_concat(column_name),' from ', table_name, ' where id = ',my_id) from
information_schema.columns
where table_schema = my_db and table_name = my_table
and column_key <> 'PRI');
prepare stmt from @str;
execute stmt;
deallocate prepare stmt;
end; //
delimiter ;
call copy_record(1,'db_name','table_name');
答案 2 :(得分:2)
根据您对@Adam Wenger的回答的评论,我只会读取一个查询中的所有字段,然后构建一个跳过id
字段的新查询。
类似的东西:
SELECT * FROM table_name WHERE id=some_id
PHP:
$sql = "INSERT INTO table_name SET ";
$first = true;
foreach ($row as $key => $value)
{
if ($key != 'id')
{
if ($first)
{
$first = false;
}
else
{
$sql .= ", ";
}
$sql .= '`' . $key . "`='" . $value . "'";
}
}
// run query
顺便说一句,我会在PDO中为两个查询生成一个准备好的语句,以便我不必担心转义数据。
答案 3 :(得分:0)
我也喜欢用不同的方式。如果安全措施中MySQL db用户帐户没有DROP权限:
SELECT `col1`, `col2`, `col3` FROM `table`
将结果放入数组中,然后将数组插入数据库。如果要修改要包含的名称,也可以提供帮助 - 复制后。
INSERT INTO `table` (`col1`, `col2`, `col3`) VALUES (?,?,?)
占位符可以是变量数组访问器($ name - 其中$ name = $ array [0])。这可能是多个步骤,但在复制的情况下,您很可能复制一行。如果有多行,则可能是一个较慢的过程,然后另一个回答。