我正在运行我的代码并收到此错误
[学说\ DBAL \异常\ DriverException]
执行' ALTER TABLE
时发生异常
ImportGenius \ Entities \ SQLite \ TradeBase \ UnitedStates \ UnitedStatesImporterIndex RENAME TO ImportGenius \ Entities \ SQLite \ TradeBa
SE \ UnitedStates的\ UnitedStatesImporterIndexTemp_2,
ImportGenius \ Entities \ SQLite \ TradeBase \ UnitedStates \ UnitedStatesImporterIndexTemp RENAME TO ImportGenius \ Entities \ SQLite \ Tra
贬低\ UnitedStates的\ UnitedStatesImporterIndex
&#39 ;:
SQLSTATE [HY000]:一般错误:1个无法识别的令牌:" \"
这是我的代码:
private function switchTable(Connection $connection, $primaryTableName, $tempTableName)
{
$secondaryTempTableName = $tempTableName.'_2';
$rawSqlQuery = "ALTER TABLE
{$primaryTableName} RENAME TO {$secondaryTempTableName},
{$tempTableName} RENAME TO {$primaryTableName}
";
$stmt = $connection->prepare($rawSqlQuery);
$stmt->execute();
}
答案 0 :(得分:1)
很可能SQL语句中的这四个变量中有一个实际上有一个\
字符,否则会出现格式错误。
92.7%(a)可以解决所有SQL语句问题,例如:
var_dump ($rawSqlQuery);
在这种情况下,\
不是表名的有效字符。事实上,它根本不是一个有效的独立令牌。
如果检查负责处理各种表名(sqlite3CreateTable
,sqlite3AlterRenameTable
等)的SQLite源代码,它们通常归结为调用sqlite3GetToken
来获取表名。
反过来,该函数会对令牌字符进行大量检查,但最重要的是,在字符串外,\
会返回令牌TK_ILLEGAL
- 它与任何字符都不匹配有效的令牌,所以它只是落在你看到的switch
语句之外:
*tokenType = TK_ILLEGAL;
return 1;
这意味着它在该上下文中无效。
事实上,如果您输入以下任何“命令”,您可以看到:
\;
create table x\y (a integer);
alter table x rename to a\b;
(a)从空气中抽取统计数据,实际值可能会有所不同: - )