CodeIgniter发生数据库错误,为什么要插入标识?

时间:2019-01-21 10:25:51

标签: php sql-server codeigniter

我有一个基于CodeIgniter的Web应用程序,该应用程序以前使用的是MySQL数据库。迁移所有数据/表后,我更改了database.php以将其连接到SQL Server。我正在测试该应用程序,并且登录正常。但是,当从Web应用程序中的表单添加对象时,它会在插入查询时引发错误。

该错误提到ID插入属性打开时无法将其插入guests表中。

  

发生数据库错误

     

错误号:23000/544

     

[Microsoft] [用于SQL Server的ODBC驱动程序17] [SQL Server]无法插入   表“来宾”中身份列的显式值何时   IDENTITY_INSERT设置为OFF。

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).')';
    }

我如何对项目进行更改,以使其不尝试在每个插入查询中插入“身份”列?

修改: 上面的代码摘录可能不是形成查询的地方,因为我对其进行了更改,并且错误仍然存​​在。

1 个答案:

答案 0 :(得分:0)

您误解了错误消息。让我们再次引用它:

  

无法在表“来宾”中为身份列插入显式值   当IDENTITY_INSERT设置为OFF时

您的表有一个标识列,即id。该错误消息专门告诉您,当id设置为off时,无法为标识列(IDENTITY_INSERT)指定显式值。 IDENTITY_INSERT是一种设置,用于确定是否允许标识列使用显式值。由于不允许这样做,因此会出现错误消息。您可以打开IDENTITY_INSERT,也可以避免在表中插入一行时指定id的值。