Основы программирования в Linux - Мэтью Нейл
if (mysql_real_connect(&my_connection, "localhost", "rick", "secret", "foo", 0, NULL, CLIENT_FOUND_ROWS)) {Если восстановить данные в вашей базе данных и затем выполнить программу с приведенным изменением, она сообщит о четырех измененных строках.
Последняя странность функции
mysql_affected_rowsWHEREmysql_affected_rowsDELETEWHEREНа подобное поведение не влияет флаг
CLIENT_FOUND_ROWSСуществует небольшая, но важная особенность вставки данных. Ранее мы упоминали столбец типа
AUTO_INCREMENTРассмотрим определение таблицы еще раз:
CREATE TABLE children ( childno INTEGER AUTO_INCREMENT NOT NULL PRIMARY KEY, fname VARCHAR(30), age INTEGER);Как видите, столбец
childnoAUTO_INCREMENTМожно выполнить оператор
SELECTSELECTAUTO_INCREMENTLAST_INSERT_ID()Когда MySQL вставляет данные в столбец типа
AUTO_INCREMENTSELECTLAST_INSERT_ID()Выполните упражнение 8.2.
AUTO_INCREMENTВы сможете увидеть, как это работает, вставив несколько значений в вашу таблицу и затем применив функцию
LAST_INSERT_ID()mysql> <b>INSERT INTO children(fname, age) VALUES('Tom', 13); </b>Query OK, 1 row affected (0.06 sec)mysql> <b>SELECT LAST_INSERT_ID();</b>+------------------+| last_insert_id() |+------------------+| 14 |+------------------+1 row in set (0.01 sec)mysql> <b>INSERT INTO children(fname, age) VALUES('Harry', 17);</b>Query OK, 1 row affected (0.02 sec)mysql> <b>SELECT LAST_INSERT_ID();</b>+------------------+| last_insert_id() |+------------------+| 15 |+------------------+1 row in set (0.00 sec)mysql>Как это работает
При каждой вставке строки MySQL выделяет новое значение для столбца
idLAST_INSERT_ID()Если хотите поэкспериментировать, чтобы убедиться в уникальности возвращаемого номера в вашем сеансе, откройте еще один сеанс и вставьте другую строку. В исходном сеансе повторите выполнение оператора
SELECT LAST_INSERT_ID();SELECT * FROM childrenВыполните упражнение 8.3.
В этом примере вы измените вашу программу insert1.c, чтобы посмотреть, как она работает на С. Ключевые изменения выделены цветом. Назовите откорректированную программу insert2.c.
#include <stdlib.h>#include <stdio.h>#include "mysql.h"int main(int argc, char *argv[]) { MYSQL my_connection;<i> MYSQL_RES* res_ptr;</i><i> MYSQL_ROW sqlrow;</i> int res; mysql_init(&myconnection); if (mysql_real_connect(&my_connection, "localhost", "rick", "bar", "rick", 0, NULL, 0)) { printf("Connection successn"); res = mysql_query(&my_connection, "INSERT INTO children(fname, age) VALUES('Robert', 7)"); if (!res) { printf("Inserted %lu rowsn", (unsigned long)mysql_affected_rows(&my_connection)); } else {