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