Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
if (mysql_real_connect(&my_connection, "localhost",
"rick", "secret", "foo", 0, NULL, CLIENT_FOUND_ROWS)) {
Если восстановить данные в вашей базе данных и затем выполнить программу с приведенным изменением, она сообщит о четырех измененных строках.
Последняя странность функции
mysql_affected_rows
WHERE
mysql_affected_rows
DELETE
WHERE
На подобное поведение не влияет флаг
CLIENT_FOUND_ROWS
Существует небольшая, но важная особенность вставки данных. Ранее мы упоминали столбец типа
AUTO_INCREMENT
Рассмотрим определение таблицы еще раз:
CREATE TABLE children (
childno INTEGER AUTO_INCREMENT NOT NULL PRIMARY KEY,
fname VARCHAR(30),
age INTEGER
);
Как видите, столбец
childno
AUTO_INCREMENT
Можно выполнить оператор
SELECT
SELECT
AUTO_INCREMENT
LAST_INSERT_ID()
Когда MySQL вставляет данные в столбец типа
AUTO_INCREMENT
SELECT
LAST_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 выделяет новое значение для столбца
id
LAST_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 {