如何插入数据库并在一个查询中获取插入的记录?

时间:2011-07-09 11:16:17

标签: php mysql codeigniter

假设您正在创建一个创建用户的CodeIgniter模型函数。

function create($data){
 $sql = "INSERT INTO people (fname,lname,age,location) VALUES(?,?,?,?)";
 $this->db->query($sql, $data);
}

function get($id){
 $sql = "SELECT * FROM people WHERE id = ? LIMIT 1";
 return $this->db->query($sql, array($id));
}

您希望create()创建用户,但返回与get()相同的内容,作为包含用户ID和其他插入信息的关联数组。

显然,这可以通过创建包含$data元素的数组来完成。但想想很多领域......它会使代码变得丑陋和不安全,因为你将处理不相关的数值数组。

有没有办法让MySQL返回带有id的插入记录,而不必使用SELECT再次查询以获得更好的性能和整洁的代码?

4 个答案:

答案 0 :(得分:1)

您可以将整个事物(INSERTSELECT)包装在一个过程中,这样可以节省数据库的标注,同时确保您准确读取数据库中存在的内容(例如自动增量列或默认值)。但程序并非每个人都喝茶。

答案 1 :(得分:1)

在MySQL中,不,没有办法做你想做的事。一些数据库(至少PostgreSQL)支持INSERT ... RETURNING语法,允许这样做。不幸的是,您将不得不重新查询新插入的行,或者从客户端代码中的输入值中修改返回值。

答案 2 :(得分:1)

您无法在MySQL的同一查询中插入和返回该行。

但是您可以使用id获取最后插入的ID(我猜这是->insert_id字段是自动生成的)。您可以使用该功能从get功能调用create

答案 3 :(得分:0)

正如@Flimzy所说,你不能在一个查询ala Postgres中用RETURNING子句来做。

你最好的选择是使用MySQL的LAST_INSERT_ID(),它保证返回新创建的记录的ID,并且其范围限定为当前会话,因此不存在获得竞争条件的问题