php - CodeIgniter 出现数据库错误,为什么要进行身份插入?
问题描述
我有一个以前使用 MySQL 数据库的基于 CodeIgniter 的 Web 应用程序。迁移所有数据/表后,我更改了 database.php 以将其连接到 SQL Server。我现在正在测试应用程序并且登录成功。但是,当从 Web 应用程序中的表单添加对象时,它会在插入查询时引发错误。
guests
该错误提到当 ID Insert 属性打开时它无法插入到表中。
发生数据库错误
错误号:23000/544
[Microsoft][ODBC Driver 17 for SQL Server][SQL Server]当 IDENTITY_INSERT 设置为 OFF 时,无法在表 'guests' 中插入标识列的显式值。
INSERT INTO "guests" ("id", "firstname", "lastname", "gender", "dob",
"email", "country_id", "state_id", "city_id", "address", "mobile",
"id_type", "id_no", "remark", "vip", "password", "added") VALUES (0,
'abc', '123', '1', '', 'abc123@123.com', '', '', '', '', '899834534',
'', '', '', 0, '6367c48dd193d56ea7b0baad25b19455e529f5ee', '2019-01-21
09:58:11')
文件名:C:/wamp64/www/hms/system/database/DB_driver.php 行号:691
我知道解决方法是 T-SQL SET IDENTITY_INSERT guests ON
,但为什么这些插入查询完全以这种方式构造?
我检查了 DB_Driver.php,这可能是相关部分
/**
* Generate an insert string
*
* @param string the table upon which the query will be performed
* @param array an associative array data of key/values
* @return string
*/
public function insert_string($table, $data)
{
$fields = $values = array();
foreach ($data as $key => $val)
{
$fields[] = $this->escape_identifiers($key);
$values[] = $this->escape($val);
}
return $this->_insert($this->protect_identifiers($table, TRUE, NULL, FALSE), $fields, $values);
}
// --------------------------------------------------------------------
/**
* Insert statement
*
* Generates a platform-specific insert string from the supplied data
*
* @param string the table name
* @param array the insert keys
* @param array the insert values
* @return string
*/
protected function _insert($table, $keys, $values)
{
return 'INSERT INTO '.$table.' ('.implode(', ', $keys).') VALUES ('.implode(', ', $values).')';
}
如何对项目进行更改,使其不会尝试在每个插入查询中插入 Identity 列?
编辑:上面的代码摘录可能不是形成查询的地方,因为我更改了它并且错误仍然存在。
解决方案
您误解了错误消息。让我们再次引用它:
当 IDENTITY_INSERT 设置为 OFF 时,无法在表“guests”中插入标识列的显式值
您的表有一个标识列,即id
. 错误消息明确告诉您,当设置为 off时,您无法为标识列 ( id
)指定显式值。是一个设置,它确定是否允许标识列使用显式值。由于不允许,因此应出现错误消息。您可以打开,或者在表中插入行时避免指定 的值。IDENTITY_INSERT
IDENTITY_INSERT
IDENTITY_INSERT
id
推荐阅读
- azure - azure keyvault 证书自动更新
- javascript - flowtype 覆盖率报告没有选择我已经定义的类型
- c# - 如何在 C# 中使用 ServerConnection SMO 获取 SQL 错误消息
- javascript - 在 javascript/html 中显示 FPS
- javascript - 错误:加载资源失败:服务器响应状态为 413(请求实体太大)
- cmake - 如何找到通过 FetchContent 下载的包的目录?
- python - 子类化 Tk 时,Python PIL PhotoImage 图像“pyimage1”不存在
- mapbox - 地图不会无头渲染
- windows - 基于 TCPIP 的 Xamarin 仿真
- javascript - 使用 bootstrap 4.5 卡时不需要的额外右填充