В основном в случае функций
mysql_
возврат 0 означает отсутствие измененных строк, а положительное значение указывает на реальный результат, обычно количество строк, затронутых оператором.
Сначала следует создать таблицу
children
в вашей базе данных
foo
, если вы еще не сделали этого. Удалите (с помощью команды
drop
) любую существующую таблицу, чтобы быть уверенным в том, что вы имеете дело с чистым определением таблицы, и повторно отправьте идентификаторы, применяемые в столбце
AUTO_INCREMENT
.
$ <b>mysql -u rick -p foo</b>
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
mysql> <b>DROP TABLE children;</b>
Query OK, 0 rows affected (0.58 sec)
mysql> <b>CREATE TABLE children (</b>
-> <b>childno int(11) AUTO_INCREMENT NOT NULL PRIMARY KEY,</b>
-> <b>fname varchar(30),</b>
-> <b>age int</b>
-> <b>);</b>
Query OK, 0 rows affected (0.09 sec)
mysql>
Теперь добавьте программный код в файл connect2.c, для того чтобы вставить новую строку в вашу таблицу. Назовите эту новую программу insert1.с. Учтите, что разбиение оператора на несколько строк объясняется физической шириной страницы; обычно вы не должны разбивать реальный SQL-оператор, если он не слишком длинный, в этом случае можно применить символ
/
в конце строки для переноса оставшейся части SQL-оператора на следующую строку.
#include <stdlib.h>
#include <stdio.h>
#include "mysql.h"
int main(int argc, char *argv[]) {
MYSQL my_connection;
<i> int res;</i>
mysql_init(&my_connection);
if (mysql_real_connect(&my_connection, "localhost",
"rick", "secret", "foo", 0, NULL, 0)) {
printf("Connection success\n");
<i> res = mysql_query(&my_connection,</i>
<i> "INSERT INTO children(fname, age) VALUES('Ann', 3)");</i>
<i> if (!res) {</i>
<i> printf("Inserted %lu rows\n",</i>
<i> (unsigned long)mysql_affected_rows(&my_connection));</i>
<i> } else {</i>
<i> fprintf(stderr, "Insert error %d: %s\n",</i>
<i> mysql_errno(&my_connection), &mysql_error(&my_connection));</i>
<i> }</i>
mysql_close(&my_connection);
} else {
fprintf(stderr, "Connection failed\n");
if (mysql_errno(&my_connection)) {
printf(stderr, "Connection error %d: %s\n",
mysql_errno(&my_connection), mysql_error(&my_connection));
}
}
return EXIT_SUCCESS;
}
Как и ожидалось, одна строка добавлена.
Теперь измените код, чтобы включить
UPDATE
вместо
INSERT
, и посмотрите на сообщение об измененных строках.
mysql_errno(&my_connection), mysql_error(&my_connection));
}
}
<i>res = mysql_query(&my_connection,</i>
<i> "UPDATE children SET AGE = 4 WHERE fname = 'Ann'");</i>
if (!res) {
printf("Updated %lu rows\n",
(unsigned long)mysql_affected_rows(&my_connection));
} else {
fprintf (stderr, "Update error %d: %s\n",
mysql_errno(&my_connection), mysql_error(&my_connection));
}
Назовите эту программу update1.c. Она пытается задать возраст 4 года для всех детей с именем Ann.
Предположим, что ваша таблица
children
содержит следующие данные:
mysql> <b>SELECT * from CHILDREN;</b>
+---------+--------+-----+
| childno | fname | age |
+---------+--------+-----+
| 1 | Jenny | 21 |
| 2 | Andrew | 17 |
| 3 | Gavin | 9 |
| 4 | Duncan | 6 |
| 5 | Emma | 4 |
| 6 | Alex | 15 |
| 7 | Adrian | 9 |
| 8 | Ann | 3 |
| 9 | Ann | 4 |
| 10 | Ann | 3 |
| 11 | Ann | 4 |
+---------+--------+-----+
11 rows in set (0.00 sec)
В вашей таблице есть четыре ребенка с именем Ann. Вы можете рассчитывать на то, что при выполнении программы update1 количество измененных строк будет равно четырем, т.е. числу строк, отбираемых по условию
WHERE
. Но если вы выполните программу, то увидите отчет программы об изменении только двух строк, поскольку учитываются только те строки, данные которых действительно нуждались в корректировке. Можно выбрать более традиционный вариант отчета, используя флаг
CLIENT_FOUND_ROWS
в функции
mysql_real_connect
: