PHP,MYSQl将一个数据库表复制到其他数据库表,并将空替换为null


PHP, MYSQl copy one database tables to others and replace empty with null

我正在将一个完整的数据库复制到另一个数据库。除了一个问题外,每件事都在工作。假设我的一个表具有以下结构

 id -> Integer PK AI
 state_id -> Integer (Default NULL)
 sell_id  -> Integer (Default NULL)

现在,此表可以在state_id和sell_id中具有 NULL。所以我向这个表查询 SELECT,一个空字符串针对所有 NULL 值返回。但是当我尝试将这些值插入其他数据库表时,它会生成错误,因为无法在整数列中给出空字符串。像选择查询返回数据一样,类似于以下数组

array(
  'id' => 1,
  'state_id' => '',
  'sell_id' => ''
)

所以我将尝试将此数组插入新表中,它将生成错误。所以我想用NULL替换所有''.我尝试通过将 NULL 设置为所有空值来遵循

  $array = array_map(function($v){
                    return $v == '' ? NULL : $v;
                },$array);

但这也会打印''到所有NULL值。这是我的完整代码

$result = mysqli_query($dbConnection1, "SELECT * FROM $table ORDER BY $sortedBy DESC limit $noOfRecords");
$columns = '';
$values = '';
if($result && mysqli_num_rows($result)) {
    while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC) ) {
        $array = array_values($row);
        $array = array_map(function($v){
            return $v == '' ? NULL : $v;
        },$array);
        $columns = " (".implode(", ",array_keys($row)).") ";
        $values .= " ('".implode("', '",$array)."'),";
    }
    $values = rtrim($values, ",");
    mysqli_query($dbConnection2, "INSERT INTO $table $columns VALUES $values");
}

但是此代码不适用于上述情况。插入查询打印为

 INSERT INTO table (id, state_id, sell_id) VALUES (1, '', '') , (2, '', '')

但我希望它像

 INSERT INTO table (id, state_id, sell_id) VALUES (1, NULL, NULL) , (2, NULL, NULL)

任何人都可以告诉我如何在我的场景中实现这一目标。

这可以通过单个查询轻松完成:

INSERT INTO newtable (newfield1, newfield2, etc...)
    SELECT oldfield1, IF(oldfield2="", NULL, oldfield2), etc...
    FROM oldtable

select可以即时更正/调整任何字段值。

请注意,您的版本容易受到 sql 注入攻击。您正在处理的数据在几毫秒前从数据库中出来并不重要 - 它仍然是未引用/未转义的数据,并且可以/会破坏您的插入查询。

首先,如果我需要移动一些数据,我只在SQL上执行此操作,就像@MarcB提到他的答案一样,但如果你坚持你的方法,我认为你需要改变以下行

return $v == '' ? NULL : $v;

return $v == '' ? 'NULL' : $v;

通过此更改,数组的空元素成为 php 的字符串 'NULL',因此当它们内爆时,它们不会转换为空字符串,它们仍将保留为字符串 NULL,因此它们将在插入 SQL 中显示为 NULL