Основы программирования в Linux
Шрифт:
mysql> INSERT INTO children(fname, age) VALUES('Tom', 13);
Query OK, 1 row affected (0.06 sec)
mysql> SELECT LAST_INSERT_ID;
+------------------+
| last_insert_id |
+------------------+
| 14 |
+------------------+
1 row in set (0.01 sec)
mysql> INSERT INTO children(fname, age) VALUES('Harry', 17);
Query OK, 1 row affected (0.02 sec)
mysql> SELECT LAST_INSERT_ID;
+------------------+
| last_insert_id |
+------------------+
| 15 |
+------------------+
1 row in set (0.00 sec)
mysql>
Как это работает
При каждой вставке строки MySQL выделяет новое значение для столбца
id
и запоминает его, поэтому вы сможете узнать это значение с помощью функции LAST_INSERT_ID
. Если хотите поэкспериментировать, чтобы убедиться в уникальности возвращаемого номера в вашем сеансе, откройте еще один сеанс и вставьте другую строку. В исходном сеансе повторите выполнение оператора
SELECT LAST_INSERT_ID;
. Вы увидите, что номер не изменился, поскольку возвращаемый номер — последний, добавленный в текущем сеансе. Но если вы выполните оператор SELECT * FROM children
, то увидите, что в другом сеансе действительно были вставлены данные. Выполните упражнение 8.3.
Упражнение 8.3. Использование автоматически формируемых ID в программе на С
В этом примере вы измените вашу программу insert1.c, чтобы посмотреть, как она работает на С. Ключевые изменения выделены цветом. Назовите откорректированную программу insert2.c.
#include <stdlib.h>
#include <stdio.h>
#include "mysql.h"
int main(int argc, char *argv[]) {
MYSQL my_connection;
MYSQL_RES* res_ptr;
MYSQL_ROW sqlrow;
int res;
mysql_init(&myconnection);
if (mysql_real_connect(&my_connection, "localhost",
"rick", "bar", "rick", 0, NULL, 0)) {
printf("Connection success\n");
res = mysql_query(&my_connection,
"INSERT INTO children(fname, age) VALUES('Robert', 7)");
if (!res) {
printf("Inserted %lu rows\n",
(unsigned long)mysql_affected_rows(&my_connection));
} else {
fprintf(stderr, "Insert error %d: %s\n",
mysql_errno(&myconnection), mysql_error(&my_connection));
}
res = mysql_query(&my_connection, "SELECT LAST INSERT ID");
if (res) {
printf("SELECT error %s\n", mysql_error(&my_connection);
} else {
res_ptr= mysql_use_result(&my_connection);
if (res_ptr) {
while ((sqlrow = mysql_fetch_row(res_ptr))) {
printf("We inserted childno %s\n", sqlrow[0]);
}
mysql_free_result(res_ptr);
}
}
mysql_close(&my_connection);
} else {
fprintf(stderr, "Connection failed\n");
if (mysql_errno(&my_connection)) {
fprintf(stderr, "Connection error %d: %s\n",
mysql_errno(&my_connection), mysql_error(&my_connection));
}
}
return EXIT_SUCCESS;
}
Далее приведен вывод:
$ gcc -I/usr/include/mysql insert2.c -L/usr/lib/mysql -lmysqlclient -o insert2
$ ./insert2
Connection success
Inserted 1 rows
We inserted childno 6
$ ./insert2
Connection success
Inserted 1 rows
We inserted childno 7
Как это работает
После вставки строки вы извлекаете выделенный ID, применив функцию
LAST_INSERT_ID
в обычном операторе SELECT
. Затем вы использовали функцию mysql_use_result
, которую мы вскоре поясним, для извлечения данных из выполненного вами оператора SELECT
и вывели их на экран. Сейчас не задумывайтесь всерьез о механизме извлечения значений, на следующих нескольких страницах мы дадим нужные пояснения.
Поделиться:
Популярные книги
Эволюционер из трущоб. Том 12
12. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Глава рода
5. Живой лёд
Фантастика:
боевая фантастика
6.55
рейтинг книги
Мир смерти
Шедевры фантастики
Фантастика:
боевая фантастика
космическая фантастика
8.77
рейтинг книги
Избранное
Старинная литература:
европейская старинная литература
6.25
рейтинг книги
Содержательное единство 2001-2006
Научно-образовательная:
политика
5.00
рейтинг книги
Весь Фрэнк Герберт в одном томе. Компиляция
Абсолют
Фантастика:
героическая фантастика
боевая фантастика
5.00
рейтинг книги
Романов. Том 1 и Том 2
1. Романов
Фантастика:
фэнтези
попаданцы
альтернативная история
5.25
рейтинг книги
12 историй о любви
Проза:
русская классическая проза
5.00
рейтинг книги
Каратила
Детективы:
боевики
6.50
рейтинг книги
Имперец. Том 4
3. Имперец
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Геймер. Тетралогия
Фантастика:
альтернативная история
6.80
рейтинг книги
Система Возвышения. (цикл 1-8) - Николай Раздоров
Система Возвышения
Фантастика:
боевая фантастика
4.65
рейтинг книги
Лекарь Империи 9
9. Лекарь Империи
Фантастика:
городское фэнтези
аниме
боевая фантастика
5.00
рейтинг книги
Том 6. Зарубежная литература и театр
6. Собрание сочинений в восьми томах
Документальная литература:
критика
5.00