+---------+--------+-----+
| 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:if (mysql_real_connect(&my_connection, "localhost",
"rick", "secret", "foo", 0, NULL, CLIENT_FOUND_ROWS)) {
Если восстановить данные в вашей базе данных и затем выполнить программу с приведенным изменением, она сообщит о четырех измененных строках.
Последняя странность функции mysql_affected_rows
WHERE, mysql_affected_rows вернет ожидаемое вами количество удаленных строк. Но если в операторе DELETE нет условия WHERE, будут удалены все строки, но в сообщении программы о количестве строк, затронутых запросом, будет указан ноль. Это происходит потому, что MySQL оптимизирует удаление всех строк, заменяя многократные построчные удаления.На подобное поведение не влияет флаг 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 — столь распространенная проблема, MySQL предлагает специальное решение в виде функции LAST_INSERT_ID.Когда MySQL вставляет данные в столбец типа AUTO_INCREMENT
SELECT специальную функцию LAST_INSERT_ID, которая действует немного похоже на псевдостолбец.Выполните упражнение 8.2.
AUTO_INCREMENTВы сможете увидеть, как это работает, вставив несколько значений в вашу таблицу и затем применив функцию LAST_INSERT_ID
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 |