假设您正在创建一个创建用户的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
再次查询以获得更好的性能和整洁的代码?
答案 0 :(得分:1)
您可以将整个事物(INSERT
加SELECT
)包装在一个过程中,这样可以节省数据库的标注,同时确保您准确读取数据库中存在的内容(例如自动增量列或默认值)。但程序并非每个人都喝茶。
答案 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,并且其范围限定为当前会话,因此不存在获得竞争条件的问题