Основы программирования в 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
и вывели их на экран. Сейчас не задумывайтесь всерьез о механизме извлечения значений, на следующих нескольких страницах мы дадим нужные пояснения.
Поделиться:
Популярные книги
Я до сих пор царь. Книга XXXII
32. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Атлант расправил плечи. Часть I. Непротивление (др. перевод)
1. Атлант расправил плечи
Фантастика:
социально-философская фантастика
8.48
рейтинг книги
Иномиры (сборник)
Классическая библиотека приключений и научной фантастики
Фантастика:
научная фантастика
7.00
рейтинг книги
Цари. Романовы. История династии
Документальная литература:
биографии и мемуары
6.09
рейтинг книги
Парижский шлейф
Любовные романы:
современные любовные романы
7.43
рейтинг книги
Бремя власти
3. Государи московские
Научно-образовательная:
история
7.25
рейтинг книги
Л. Пантелеев — Л. Чуковская. Переписка (1929–1987)
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Рыцарь Империи
3. Одержимый
Фантастика:
фэнтези
9.39
рейтинг книги
История всемирной литературы Т.6
Научно-образовательная:
история
культурология
литературоведение
6.25
рейтинг книги
Последний реанорец. Том IV
3. Высшая Речь
Фантастика:
фэнтези
5.20
рейтинг книги
Киберпространство
43. Экспансия: История Галактики
Фантастика:
космическая фантастика
7.69
рейтинг книги
Газлайтер. Том 20
20. История Телепата
Фантастика:
боевая фантастика
аниме
попаданцы
5.25
рейтинг книги
Правда о Григории Распутине
Научно-образовательная:
история
5.00
рейтинг книги
Трапеция
Проза:
современная проза
5.00