克隆 table 行在 php 中失败,但通过 sql shell 成功
Cloning table row fails in php, but succeeds via sql shell
克隆 table 行出错了。你不会相信 codesnippet 2
对此感到抱歉。
因此,我正在尝试在包含大量列的 table 中克隆一个 table 行。当然,我不想为每一列命名。
我找到了一个解决方案,这在 mySQL WorkBench 接口中完美工作(sql shell) 。在这里,我使用 PK="TEST" 克隆行,我希望生成的行具有 "TEST1"
的 PK
CREATE TEMPORARY TABLE temp_tbl SELECT * FROM pianos WHERE pianoID = $oldPianoID;
UPDATE temp_tbl SET pianoID = '$newPianoID' WHERE pianoID = '$oldPianoID';
INSERT INTO pianos SELECT * FROM temp_tbl;
DROP TABLE temp_tbl;
但是当在 php 中应用此 sql-脚本时,它失败并给我以下错误:
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'UPDATE temp_tbl SET pianoID = 'TEST1' WHERE pianoID = 'TEST';
INSERT INTO ' at line 2
同样,这适用于 shell,但不适用于我 运行 PHP5 和 MariaDB 10.0.23
的服务器
我认为使用 blob 存储的某些字段可能存在问题,但我无法理解这一点,因为它适用于 shell。
我是不是遗漏了什么明显的东西?
Carreful,你总是用简单的引用
您需要更改代码:
'UPDATE temp_tbl SET pianoID = 'TEST1' WHERE pianoID = 'TEST';
至:
'UPDATE temp_tbl SET pianoID = "TEST1" WHERE pianoID = "TEST"';
对于在 PHP 中的字符串中插入 var,您可以使用不同的可能性:双引号或 contactain
在双引号中,PHP解释代码,在单引号中没有。
Si,你可以这样写:
$sql = "UPDATE temp_tbl SET pianoID = '$var' WHERE pianoID = '$var2'";
或:
$sql = 'UPDATE temp_tbl SET pianoID = "'.$var.'" WHERE pianoID = "'.$var2.'"';
http://php.net/manual/en/language.types.string.php
$var = 'test1';
$var2 = 'test';
echo "UPDATE temp_tbl SET pianoID = '$var' WHERE pianoID = '$var2'";
// show : UPDATE temp_tbl SET pianoID = 'test1' WHERE pianoID = 'test'
如果你看错误:
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'UPDATE temp_tbl SET pianoID = 'TEST1' WHERE pianoID = 'TEST';
INSERT INTO ' at line 2
您正在尝试一次执行 2 个查询 - 您无法通过标准 mysqli::query()
执行此操作 - 您需要改用 mysqli::multi_query()
。
如果 newPianoId 不重要你可以使用这个 sql:
INSERT INTO pianos SELECT CONCAT(pianoID,UNIX_TIMESTAMP()), column1, column2, column3, ... FROM pianos WHERE 1
使用此 sql 您将使用新 ID 复制所有钢琴。请注意,您的 pianoID 列有足够的 space of UNIX_TIMESTAMP() 输出,至少我想尝试给出这个想法。
PS:如果不需要复制所有数据,可以使用 where 子句。喜欢
WHERE pianoID < 123456 AND create_date <= '2016-03-10'
等等
克隆 table 行出错了。你不会相信 codesnippet 2
对此感到抱歉。
因此,我正在尝试在包含大量列的 table 中克隆一个 table 行。当然,我不想为每一列命名。 我找到了一个解决方案,这在 mySQL WorkBench 接口中完美工作(sql shell) 。在这里,我使用 PK="TEST" 克隆行,我希望生成的行具有 "TEST1"
的 PKCREATE TEMPORARY TABLE temp_tbl SELECT * FROM pianos WHERE pianoID = $oldPianoID;
UPDATE temp_tbl SET pianoID = '$newPianoID' WHERE pianoID = '$oldPianoID';
INSERT INTO pianos SELECT * FROM temp_tbl;
DROP TABLE temp_tbl;
但是当在 php 中应用此 sql-脚本时,它失败并给我以下错误:
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'UPDATE temp_tbl SET pianoID = 'TEST1' WHERE pianoID = 'TEST';
INSERT INTO ' at line 2
同样,这适用于 shell,但不适用于我 运行 PHP5 和 MariaDB 10.0.23
的服务器我认为使用 blob 存储的某些字段可能存在问题,但我无法理解这一点,因为它适用于 shell。
我是不是遗漏了什么明显的东西?
Carreful,你总是用简单的引用
您需要更改代码:
'UPDATE temp_tbl SET pianoID = 'TEST1' WHERE pianoID = 'TEST';
至:
'UPDATE temp_tbl SET pianoID = "TEST1" WHERE pianoID = "TEST"';
对于在 PHP 中的字符串中插入 var,您可以使用不同的可能性:双引号或 contactain
在双引号中,PHP解释代码,在单引号中没有。
Si,你可以这样写:
$sql = "UPDATE temp_tbl SET pianoID = '$var' WHERE pianoID = '$var2'";
或:
$sql = 'UPDATE temp_tbl SET pianoID = "'.$var.'" WHERE pianoID = "'.$var2.'"';
http://php.net/manual/en/language.types.string.php
$var = 'test1';
$var2 = 'test';
echo "UPDATE temp_tbl SET pianoID = '$var' WHERE pianoID = '$var2'";
// show : UPDATE temp_tbl SET pianoID = 'test1' WHERE pianoID = 'test'
如果你看错误:
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'UPDATE temp_tbl SET pianoID = 'TEST1' WHERE pianoID = 'TEST';
INSERT INTO ' at line 2
您正在尝试一次执行 2 个查询 - 您无法通过标准 mysqli::query()
执行此操作 - 您需要改用 mysqli::multi_query()
。
如果 newPianoId 不重要你可以使用这个 sql:
INSERT INTO pianos SELECT CONCAT(pianoID,UNIX_TIMESTAMP()), column1, column2, column3, ... FROM pianos WHERE 1
使用此 sql 您将使用新 ID 复制所有钢琴。请注意,您的 pianoID 列有足够的 space of UNIX_TIMESTAMP() 输出,至少我想尝试给出这个想法。
PS:如果不需要复制所有数据,可以使用 where 子句。喜欢
WHERE pianoID < 123456 AND create_date <= '2016-03-10'
等等