我在PHP中运行此SQL语句,将所有列中的数据从“other”复制到“table”(表和其他列都具有相同的列名)
$x=mysqli_query($conn,"INSERT INTO table SELECT * from other WHERE item_id='33'");
$nid=mysqli_insert_id($conn);
我希望$ nid能够从它刚刚插入的“table”中获得新的ID,而是返回“33”,这是另一个表的ID来源。
也许它复制了包括其他表中的ID在内的所有内容并返回了该内容?
有人知道为什么或如何解决?
由于
答案 0 :(得分:-1)
由于两个表的列名相同,因此insert
设置了 id 以及所有其他字段。
要避免从other
选择除item_id
您可以静态编写查询中的所有列名称(除了一个)以代替*
,或者您可以使用初步查询以dinamically方式构建列列表:
// Get all columns names except one
// as comma separated list
// Column names are bacltick quoted
$result = $conn->query(
"SELECT `COLUMN_NAME` "
. "FROM `INFORMATION_SCHEMA`.`COLUMNS` "
. "WHERE `TABLE_SCHEMA`='your_db_name' " // DB name here
. "AND `TABLE_NAME`='other' " // TABLE name here
. "AND `COLUMN_NAME` != 'item_id'" ); // EXCLUDED column here
if( ! $result )
{
// HANDLE EXCEPTION
}
$columns = $result->fetch_all();
foreach( $columns as &$c )
{
$c = '`' . $c[ 0 ] . '`';
}
$columns = implode( ',', $columns );
// Perform the copy
$x = mysqli_query( $conn, "INSERT INTO `table` SELECT $columns from `other` WHERE item_id='33'");
$nid = mysqli_insert_id( $conn );
附注:如果您的目标表名称为table
,必须在反引号`table`
之间进行转义。