Как вставить в базу данных и извлечь вставленную запись в одном запросе? - PullRequest
1 голос
/ 09 июля 2011

Допустим, вы создаете функцию модели 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(), в качестве ассоциативного массива, содержащегоидентификатор пользователя и другая вставленная информация.

Очевидно, что это можно сделать, создав массив, содержащий элементы $data.Но подумайте о множестве полей ... это делает код уродливым и небезопасным для изменения, потому что вы будете иметь дело с числовыми массивами, не ассоциативными.

Есть ли способ для MySQL вернуть вставленную запись с идентификаторомбез необходимости повторного запроса, используя SELECT для лучшей производительности и аккуратного кода?

Ответы [ 4 ]

1 голос
/ 09 июля 2011

В MySQL нет, нет способа делать то, что вы хотите. Некоторые базы данных (по крайней мере PostgreSQL) поддерживают синтаксис INSERT ... RETURNING, что позволяет это. К сожалению, вам придется либо повторно запросить вновь вставленную строку, либо исказить возвращаемое значение из входного значения в вашем клиентском коде.

1 голос
/ 09 июля 2011

Вы не можете вставить и вернуть строку в том же запросе с MySQL.

Но вы можете получить последний вставленный идентификатор (я предполагаю, что поле id генерируется автоматически) с помощью ->insert_id,Вы можете использовать это для вызова get из вашей функции create.

1 голос
/ 09 июля 2011

Вы можете обернуть все это (INSERT плюс SELECT) в процедуру, которая сэкономит вам обратный вызов в базу данных и в то же время гарантирует, что вы точно прочитали, что существует в базе данных (например, автоинкрементстолбцы или значения по умолчанию).Но процедуры не для всех.

0 голосов
/ 09 июля 2011

Как сказал @Flimzy, вы не можете сделать это в одном запросе аля Postgres с его предложением RETURNING.

Лучше всего использовать MySQL LAST_INSERT_ID(), который гарантированно возвращает идентификатор вновь созданной записи ион ограничен текущим сеансом, поэтому нет проблем с получением условия гонки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...