sql >> Databasteknik >  >> RDS >> MariaDB

MariaDB ROW_COUNT() Förklarad

I MariaDB, ROW_COUNT() är en inbyggd funktion som returnerar antalet rader som uppdaterats, infogats eller tagits bort av föregående sats.

Värdet som returneras av ROW_COUNT() är samma som radantalet som mysql klienten visas och värdet från mysql_affected_rows() C API-funktion.

Syntax

Syntaxen ser ut så här:

ROW_COUNT()

Inga argument krävs eller accepteras.

Exempel

DDL-utlåtanden

För DDL-satser (inklusive TRUNCATE ) och för andra satser som inte returnerar någon resultatuppsättning (som USE , DO , SIGNAL eller DEALLOCATE PREPARE ), ROW_COUNT() funktion returnerar 0 .

Låt oss skapa en tabell:

CREATE OR REPLACE TABLE guest (
  guest_id INT NOT NULL AUTO_INCREMENT,
  guest_name VARCHAR(255) NOT NULL,
  PRIMARY KEY (guest_id)
);

Resultat:

Query OK, 0 rows affected (0.046 sec)

Och kör ROW_COUNT() :

SELECT ROW_COUNT();

Resultat:

+-------------+
| ROW_COUNT() |
+-------------+
|           0 |
+-------------+

Som förväntat, 0 returneras, eftersom noll rader påverkades.

DML-uttalanden

För andra DML-satser än SELECT och för ALTER TABLE , ROW_COUNT() funktion returnerar antalet berörda rader.

Nedan finns några exempel.

Infoga data

Låt oss nu infoga några rader:

INSERT INTO guest (guest_name) VALUES ('Homer');
INSERT INTO guest (guest_name) VALUES ('Bart');
INSERT INTO guest (guest_name) VALUES ('Marge');

Resultat:

MariaDB [Zap]> INSERT INTO guest (guest_name) VALUES ('Homer');
Query OK, 1 row affected (0.037 sec)

MariaDB [Zap]> INSERT INTO guest (guest_name) VALUES ('Bart');
Query OK, 1 row affected (0.001 sec)

MariaDB [Zap]> INSERT INTO guest (guest_name) VALUES ('Marge');
Query OK, 1 row affected (0.002 sec)

Varje påstående resulterade i att en rad påverkades.

Och låt oss köra ROW_COUNT() igen:

SELECT ROW_COUNT();

Resultat:

+-------------+
| ROW_COUNT() |
+-------------+
|           1 |
+-------------+

Detta returnerar 1 eftersom det var så många rader som påverkades i det senaste uttalandet. Även om vi påverkade tre rader tog det tre satser för att göra det (varje sats infogade bara en rad och ROW_COUNT() rapporterar endast om det sista uttalandet).

Uppdatera data

Låt oss nu uppdatera data i alla tre raderna:

UPDATE guest
SET guest_name = 'Homer';

Resultat:

Query OK, 2 rows affected (0.008 sec)
Rows matched: 3  Changed: 2  Warnings: 0

Min mariadb klienten berättar att även om tre rader matchade kriterierna, ändrades bara två rader. Detta beror på att den första raden redan innehåller Homer , vilket också är vad vi försöker uppdatera den till.

Låt oss se vad ROW_COUNT() returnerar:

SELECT ROW_COUNT();

Resultat:

+-------------+
| ROW_COUNT() |
+-------------+
|           2 |
+-------------+

Som förväntat returnerar den 2 , eftersom det var så många rader som faktiskt uppdaterades.

Resultatuppsättningsutlåtanden

För satser som returnerar en resultatuppsättning (som SELECT , SHOW , DESC eller HELP ), ROW_COUNT() funktion returnerar -1 , även när resultatuppsättningen är tom. Detta gäller även för administrativa uttalanden, såsom OPTIMIZE .

Exempel:

SELECT * FROM guest;

Resultat:

+----------+------------+
| guest_id | guest_name |
+----------+------------+
|        1 | Homer      |
|        2 | Homer      |
|        3 | Homer      |
+----------+------------+
3 rows in set (0.000 sec)

Ring nu ROW_COUNT() igen:

SELECT ROW_COUNT();

Resultat:

+-------------+
| ROW_COUNT() |
+-------------+
|          -1 |
+-------------+

Främmande nycklar och utlösare

Observera att ROW_COUNT() tar inte hänsyn till rader som inte direkt raderas/uppdateras av det sista påståendet. Detta innebär att rader som tagits bort av främmande nycklar eller triggers inte räknas.

Mer information

Se MariaDB-dokumentationen för mer information och några andra saker att tänka på när du använder den här funktionen.


  1. Skriptet för MySQL-replikeringshälsokontroll

  2. Hur gör man en skiftlägeskänslig sökning i WHERE-satsen (jag använder SQL Server)?

  3. Kan vi omfördela Oracle tools.jar?

  4. Hämta en bild lagrad som BLOB på en MYSQL DB