Pre-General Availability Draft: 2017-07-17
Table 12.18 Information Functions
| Name | Description |
|---|---|
BENCHMARK() | Repeatedly execute an expression |
CHARSET() | Return the character set of the argument |
COERCIBILITY() | Return the collation coercibility value of the string argument |
COLLATION() | Return the collation of the string argument |
CONNECTION_ID() | Return the connection ID (thread ID) for the connection |
CURRENT_ROLE() | Returns the current active roles |
CURRENT_USER(), CURRENT_USER | The authenticated user name and host name |
DATABASE() | Return the default (current) database name |
FOUND_ROWS() | For a SELECT with a LIMIT clause, the number of rows that would be returned were there no LIMIT clause |
LAST_INSERT_ID() | Value of the AUTOINCREMENT column for the last INSERT |
ROLES_GRAPHML() | Returns a GraphML document representing memory role subgraphs |
ROW_COUNT() | The number of rows updated |
SCHEMA() | Synonym for DATABASE() |
SESSION_USER() | Synonym for USER() |
SYSTEM_USER() | Synonym for USER() |
USER() | The user name and host name provided by the client |
VERSION() | Return a string that indicates the MySQL server version |
The
BENCHMARK()function executes the expressionexprrepeatedlycounttimes. It may be used to time how quickly MySQL processes the expression. The result value is always0. The intended use is from within the mysql client, which reports query execution times:mysql> SELECT BENCHMARK(1000000,ENCODE('hello','goodbye')); +----------------------------------------------+ | BENCHMARK(1000000,ENCODE('hello','goodbye')) | +----------------------------------------------+ | 0 | +----------------------------------------------+ 1 row in set (4.74 sec)The time reported is elapsed time on the client end, not CPU time on the server end. It is advisable to execute
BENCHMARK()several times, and to interpret the result with regard to how heavily loaded the server machine is.BENCHMARK()is intended for measuring the runtime performance of scalar expressions, which has some significant implications for the way that you use it and interpret the results:Only scalar expressions can be used. Although the expression can be a subquery, it must return a single column and at most a single row. For example,
BENCHMARK(10, (SELECT * FROM t))will fail if the tablethas more than one column or more than one row.Executing a
SELECTstatementexprNtimes differs from executingSELECT BENCHMARK(in terms of the amount of overhead involved. The two have very different execution profiles and you should not expect them to take the same amount of time. The former involves the parser, optimizer, table locking, and runtime evaluationN,expr)Ntimes each. The latter involves only runtime evaluationNtimes, and all the other components just once. Memory structures already allocated are reused, and runtime optimizations such as local caching of results already evaluated for aggregate functions can alter the results. Use ofBENCHMARK()thus measures performance of the runtime component by giving more weight to that component and removing the “noise” introduced by the network, parser, optimizer, and so forth.
Returns the character set of the string argument.
mysql> SELECT CHARSET('abc'); -> 'utf8' mysql> SELECT CHARSET(CONVERT('abc' USING latin1)); -> 'latin1' mysql> SELECT CHARSET(USER()); -> 'utf8'Returns the collation coercibility value of the string argument.
mysql> SELECT COERCIBILITY('abc' COLLATE utf8_swedish_ci); -> 0 mysql> SELECT COERCIBILITY(USER()); -> 3 mysql> SELECT COERCIBILITY('abc'); -> 4 mysql> SELECT COERCIBILITY(1000); -> 5The return values have the meanings shown in the following table. Lower values have higher precedence.
Coercibility Meaning Example 0Explicit collation Value with COLLATEclause1No collation Concatenation of strings with different collations 2Implicit collation Column value, stored routine parameter or local variable 3System constant USER()return value4Coercible Literal string 5Numeric Numeric or temporal value 5Ignorable NULLor an expression derived fromNULLFor more information, see Section 10.1.8.4, “Collation Coercibility in Expressions”.
Returns the collation of the string argument.
mysql> SELECT COLLATION('abc'); -> 'utf8_general_ci' mysql> SELECT COLLATION(_utf8mb4'abc'); -> 'utf8mb4_0900_ai_ci' mysql> SELECT COLLATION(_latin1'abc'); -> 'latin1_swedish_ci'Returns the connection ID (thread ID) for the connection. Every connection has an ID that is unique among the set of currently connected clients.
The value returned by
CONNECTION_ID()is the same type of value as displayed in theIDcolumn of theINFORMATION_SCHEMA.PROCESSLISTtable, theIdcolumn ofSHOW PROCESSLISToutput, and thePROCESSLIST_IDcolumn of the Performance Schemathreadstable.mysql> SELECT CONNECTION_ID(); -> 23786Returns a
utf8string containing the current active roles for the current session, separated by commas, orNONEif there are none. The value reflects the setting of thesql_quote_show_createsystem variable.Suppose that an account is granted roles as follows:
GRANT 'r1', 'r2' TO 'u1'@'localhost'; SET DEFAULT ROLE ALL TO 'u1'@'localhost';In sessions for
u1, the initialCURRENT_ROLE()value names the default account roles. UsingSET ROLEchanges that:mysql> SELECT CURRENT_ROLE(); +-------------------+ | CURRENT_ROLE() | +-------------------+ | `r1`@`%`,`r2`@`%` | +-------------------+ mysql> SET ROLE 'r1'; SELECT CURRENT_ROLE(); +----------------+ | CURRENT_ROLE() | +----------------+ | `r1`@`%` | +----------------+Returns the user name and host name combination for the MySQL account that the server used to authenticate the current client. This account determines your access privileges. The return value is a string in the
utf8character set.The value of
CURRENT_USER()can differ from the value ofUSER().mysql> SELECT USER(); -> 'davida@localhost' mysql> SELECT * FROM mysql.user; ERROR 1044: Access denied for user ''@'localhost' to database 'mysql' mysql> SELECT CURRENT_USER(); -> '@localhost'The example illustrates that although the client specified a user name of
davida(as indicated by the value of theUSER()function), the server authenticated the client using an anonymous user account (as seen by the empty user name part of theCURRENT_USER()value). One way this might occur is that there is no account listed in the grant tables fordavida.Within a stored program or view,
CURRENT_USER()returns the account for the user who defined the object (as given by itsDEFINERvalue) unless defined with theSQL SECURITY INVOKERcharacteristic. In the latter case,CURRENT_USER()returns the object's invoker.Triggers and events have no option to define the
SQL SECURITYcharacteristic, so for these objects,CURRENT_USER()returns the account for the user who defined the object. To return the invoker, useUSER()orSESSION_USER().The following statements support use of the
CURRENT_USER()function to take the place of the name of (and, possibly, a host for) an affected user or a definer; in such cases,CURRENT_USER()is expanded where and as needed:For information about the implications that this expansion of
CURRENT_USER()has for replication, see Section 18.4.1.8, “Replication of CURRENT_USER()”.Returns the default (current) database name as a string in the
utf8character set. If there is no default database,DATABASE()returnsNULL. Within a stored routine, the default database is the database that the routine is associated with, which is not necessarily the same as the database that is the default in the calling context.mysql> SELECT DATABASE(); -> 'test'If there is no default database,
DATABASE()returnsNULL.A
SELECTstatement may include aLIMITclause to restrict the number of rows the server returns to the client. In some cases, it is desirable to know how many rows the statement would have returned without theLIMIT, but without running the statement again. To obtain this row count, include anSQL_CALC_FOUND_ROWSoption in theSELECTstatement, and then invokeFOUND_ROWS()afterward:mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name -> WHERE id > 100 LIMIT 10; mysql> SELECT FOUND_ROWS();The second
SELECTreturns a number indicating how many rows the firstSELECTwould have returned had it been written without theLIMITclause.In the absence of the
SQL_CALC_FOUND_ROWSoption in the most recent successfulSELECTstatement,FOUND_ROWS()returns the number of rows in the result set returned by that statement. If the statement includes aLIMITclause,FOUND_ROWS()returns the number of rows up to the limit. For example,FOUND_ROWS()returns 10 or 60, respectively, if the statement includesLIMIT 10orLIMIT 50, 10.The row count available through
FOUND_ROWS()is transient and not intended to be available past the statement following theSELECT SQL_CALC_FOUND_ROWSstatement. If you need to refer to the value later, save it:mysql> SELECT SQL_CALC_FOUND_ROWS * FROM ... ; mysql> SET @rows = FOUND_ROWS();If you are using
SELECT SQL_CALC_FOUND_ROWS, MySQL must calculate how many rows are in the full result set. However, this is faster than running the query again withoutLIMIT, because the result set need not be sent to the client.SQL_CALC_FOUND_ROWSandFOUND_ROWS()can be useful in situations when you want to restrict the number of rows that a query returns, but also determine the number of rows in the full result set without running the query again. An example is a Web script that presents a paged display containing links to the pages that show other sections of a search result. UsingFOUND_ROWS()enables you to determine how many other pages are needed for the rest of the result.The use of
SQL_CALC_FOUND_ROWSandFOUND_ROWS()is more complex forUNIONstatements than for simpleSELECTstatements, becauseLIMITmay occur at multiple places in aUNION. It may be applied to individualSELECTstatements in theUNION, or global to theUNIONresult as a whole.The intent of
SQL_CALC_FOUND_ROWSforUNIONis that it should return the row count that would be returned without a globalLIMIT. The conditions for use ofSQL_CALC_FOUND_ROWSwithUNIONare:The
SQL_CALC_FOUND_ROWSkeyword must appear in the firstSELECTof theUNION.The value of
FOUND_ROWS()is exact only ifUNION ALLis used. IfUNIONwithoutALLis used, duplicate removal occurs and the value ofFOUND_ROWS()is only approximate.If no
LIMITis present in theUNION,SQL_CALC_FOUND_ROWSis ignored and returns the number of rows in the temporary table that is created to process theUNION.
Beyond the cases described here, the behavior of
FOUND_ROWS()is undefined (for example, its value following aSELECTstatement that fails with an error).ImportantFOUND_ROWS()is not replicated reliably using statement-based replication. This function is automatically replicated using row-based replication.LAST_INSERT_ID(),LAST_INSERT_ID(expr)With no argument,
LAST_INSERT_ID()returns aBIGINT UNSIGNED(64-bit) value representing the first automatically generated value successfully inserted for anAUTO_INCREMENTcolumn as a result of the most recently executedINSERTstatement. The value ofLAST_INSERT_ID()remains unchanged if no rows are successfully inserted.With an argument,
LAST_INSERT_ID()returns an unsigned integer.For example, after inserting a row that generates an
AUTO_INCREMENTvalue, you can get the value like this:mysql> SELECT LAST_INSERT_ID(); -> 195The currently executing statement does not affect the value of
LAST_INSERT_ID(). Suppose that you generate anAUTO_INCREMENTvalue with one statement, and then refer toLAST_INSERT_ID()in a multiple-rowINSERTstatement that inserts rows into a table with its ownAUTO_INCREMENTcolumn. The value ofLAST_INSERT_ID()will remain stable in the second statement; its value for the second and later rows is not affected by the earlier row insertions. (However, if you mix references toLAST_INSERT_ID()andLAST_INSERT_ID(, the effect is undefined.)expr)If the previous statement returned an error, the value of
LAST_INSERT_ID()is undefined. For transactional tables, if the statement is rolled back due to an error, the value ofLAST_INSERT_ID()is left undefined. For manualROLLBACK, the value ofLAST_INSERT_ID()is not restored to that before the transaction; it remains as it was at the point of theROLLBACK.Within the body of a stored routine (procedure or function) or a trigger, the value of
LAST_INSERT_ID()changes the same way as for statements executed outside the body of these kinds of objects. The effect of a stored routine or trigger upon the value ofLAST_INSERT_ID()that is seen by following statements depends on the kind of routine:If a stored procedure executes statements that change the value of
LAST_INSERT_ID(), the changed value is seen by statements that follow the procedure call.For stored functions and triggers that change the value, the value is restored when the function or trigger ends, so following statements will not see a changed value.
The ID that was generated is maintained in the server on a per-connection basis. This means that the value returned by the function to a given client is the first
AUTO_INCREMENTvalue generated for most recent statement affecting anAUTO_INCREMENTcolumn by that client. This value cannot be affected by other clients, even if they generateAUTO_INCREMENTvalues of their own. This behavior ensures that each client can retrieve its own ID without concern for the activity of other clients, and without the need for locks or transactions.The value of
LAST_INSERT_ID()is not changed if you set theAUTO_INCREMENTcolumn of a row to a non-“magic” value (that is, a value that is notNULLand not0).ImportantIf you insert multiple rows using a single
INSERTstatement,LAST_INSERT_ID()returns the value generated for the first inserted row only. The reason for this is to make it possible to reproduce easily the sameINSERTstatement against some other server.For example:
mysql> USE test; Database changed mysql> CREATE TABLE t ( -> id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, -> name VARCHAR(10) NOT NULL -> ); Query OK, 0 rows affected (0.09 sec) mysql> INSERT INTO t VALUES (NULL, 'Bob'); Query OK, 1 row affected (0.01 sec) mysql> SELECT * FROM t; +----+------+ | id | name | +----+------+ | 1 | Bob | +----+------+ 1 row in set (0.01 sec) mysql> SELECT LAST_INSERT_ID(); +------------------+ | LAST_INSERT_ID() | +------------------+ | 1 | +------------------+ 1 row in set (0.00 sec) mysql> INSERT INTO t VALUES -> (NULL, 'Mary'), (NULL, 'Jane'), (NULL, 'Lisa'); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM t; +----+------+ | id | name | +----+------+ | 1 | Bob | | 2 | Mary | | 3 | Jane | | 4 | Lisa | +----+------+ 4 rows in set (0.01 sec) mysql> SELECT LAST_INSERT_ID(); +------------------+ | LAST_INSERT_ID() | +------------------+ | 2 | +------------------+ 1 row in set (0.00 sec)Although the second
INSERTstatement inserted three new rows intot, the ID generated for the first of these rows was2, and it is this value that is returned byLAST_INSERT_ID()for the followingSELECTstatement.If you use
INSERT IGNOREand the row is ignored, theLAST_INSERT_ID()remains unchanged from the current value (or 0 is returned if the connection has not yet performed a successfulINSERT) and, for non-transactional tables, theAUTO_INCREMENTcounter is not incremented. ForInnoDBtables, theAUTO_INCREMENTcounter is incremented ifinnodb_autoinc_lock_modeis set to1or2, as demonstrated in the following example:mysql> USE test; Database changed mysql> SELECT @@innodb_autoinc_lock_mode; +----------------------------+ | @@innodb_autoinc_lock_mode | +----------------------------+ | 1 | +----------------------------+ 1 row in set (0.00 sec) mysql> CREATE TABLE `t` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `val` INT(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `i1` (`val`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; Query OK, 0 rows affected (0.02 sec) -- Insert two rows mysql> INSERT INTO t (val) VALUES (1),(2); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 -- With auto_increment_offset=1, the inserted rows -- result in an AUTO_INCREMENT value of 3 mysql> SHOW CREATE TABLE t\G *************************** 1. row *************************** Table: t Create Table: CREATE TABLE `t` ( `id` int(11) NOT NULL AUTO_INCREMENT, `val` int(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `i1` (`val`) ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 1 row in set (0.00 sec) -- LAST_INSERT_ID() returns the first automatically generated -- value that is successfully inserted for the AUTO_INCREMENT column mysql> SELECT LAST_INSERT_ID(); +------------------+ | LAST_INSERT_ID() | +------------------+ | 1 | +------------------+ 1 row in set (0.00 sec) -- The attempted insertion of duplicate rows fail but errors are ignored mysql> INSERT IGNORE INTO t (val) VALUES (1),(2); Query OK, 0 rows affected (0.00 sec) Records: 2 Duplicates: 2 Warnings: 0 -- With innodb_autoinc_lock_mode=1, the AUTO_INCREMENT counter -- is incremented for the ignored rows mysql> SHOW CREATE TABLE t\G *************************** 1. row *************************** Table: t Create Table: CREATE TABLE `t` ( `id` int(11) NOT NULL AUTO_INCREMENT, `val` int(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `i1` (`val`) ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 1 row in set (0.00 sec) -- The LAST_INSERT_ID is unchanged becuase the previous insert was unsuccessful mysql> SELECT LAST_INSERT_ID(); +------------------+ | LAST_INSERT_ID() | +------------------+ | 1 | +------------------+ 1 row in set (0.00 sec)See Section 15.8.1.5, “AUTO_INCREMENT Handling in InnoDB” for more information.
If
expris given as an argument toLAST_INSERT_ID(), the value of the argument is returned by the function and is remembered as the next value to be returned byLAST_INSERT_ID(). This can be used to simulate sequences:Create a table to hold the sequence counter and initialize it:
mysql> CREATE TABLE sequence (id INT NOT NULL); mysql> INSERT INTO sequence VALUES (0);Use the table to generate sequence numbers like this:
mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1); mysql> SELECT LAST_INSERT_ID();The
UPDATEstatement increments the sequence counter and causes the next call toLAST_INSERT_ID()to return the updated value. TheSELECTstatement retrieves that value. Themysql_insert_id()C API function can also be used to get the value. See Section 27.7.7.38, “mysql_insert_id()”.
You can generate sequences without calling
LAST_INSERT_ID(), but the utility of using the function this way is that the ID value is maintained in the server as the last automatically generated value. It is multi-user safe because multiple clients can issue theUPDATEstatement and get their own sequence value with theSELECTstatement (ormysql_insert_id()), without affecting or being affected by other clients that generate their own sequence values.Note that
mysql_insert_id()is only updated afterINSERTandUPDATEstatements, so you cannot use the C API function to retrieve the value forLAST_INSERT_ID(after executing other SQL statements likeexpr)SELECTorSET.Returns a
utf8string containing a GraphML document representing memory role subgraphs. TheROLE_ADMINorSUPERprivilege is required to see content in the<graphml>element. Otherwise, the result shows only an empty element:mysql> SELECT ROLES_GRAPHML(); +---------------------------------------------------+ | ROLES_GRAPHML() | +---------------------------------------------------+ | <?xml version="1.0" encoding="UTF-8"?><graphml /> | +---------------------------------------------------+ROW_COUNT()returns a value as follows:DDL statements: 0. This applies to statements such as
CREATE TABLEorDROP TABLE.DML statements other than
SELECT: The number of affected rows. This applies to statements such asUPDATE,INSERT, orDELETE(as before), but now also to statements such asALTER TABLEandLOAD DATA INFILE.SELECT: -1 if the statement returns a result set, or the number of rows “affected” if it does not. For example, forSELECT * FROM t1,ROW_COUNT()returns -1. ForSELECT * FROM t1 INTO OUTFILE ',file_name'ROW_COUNT()returns the number of rows written to the file.SIGNALstatements: 0.
For
UPDATEstatements, the affected-rows value by default is the number of rows actually changed. If you specify theCLIENT_FOUND_ROWSflag tomysql_real_connect()when connecting to mysqld, the affected-rows value is the number of rows “found”; that is, matched by theWHEREclause.For
REPLACEstatements, the affected-rows value is 2 if the new row replaced an old row, because in this case, one row was inserted after the duplicate was deleted.For
INSERT ... ON DUPLICATE KEY UPDATEstatements, the affected-rows value per row is 1 if the row is inserted as a new row, 2 if an existing row is updated, and 0 if an existing row is set to its current values. If you specify theCLIENT_FOUND_ROWSflag, the affected-rows value is 1 (not 0) if an existing row is set to its current values.The
ROW_COUNT()value is similar to the value from themysql_affected_rows()C API function and the row count that the mysql client displays following statement execution.mysql> INSERT INTO t VALUES(1),(2),(3); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> SELECT ROW_COUNT(); +-------------+ | ROW_COUNT() | +-------------+ | 3 | +-------------+ 1 row in set (0.00 sec) mysql> DELETE FROM t WHERE i IN(1,2); Query OK, 2 rows affected (0.00 sec) mysql> SELECT ROW_COUNT(); +-------------+ | ROW_COUNT() | +-------------+ | 2 | +-------------+ 1 row in set (0.00 sec)ImportantROW_COUNT()is not replicated reliably using statement-based replication. This function is automatically replicated using row-based replication.This function is a synonym for
DATABASE().SESSION_USER()is a synonym forUSER().SYSTEM_USER()is a synonym forUSER().Returns the current MySQL user name and host name as a string in the
utf8character set.mysql> SELECT USER(); -> 'davida@localhost'The value indicates the user name you specified when connecting to the server, and the client host from which you connected. The value can be different from that of
CURRENT_USER().Returns a string that indicates the MySQL server version. The string uses the
utf8character set. The value might have a suffix in addition to the version number. See the description of theversionsystem variable in Section 5.1.5, “Server System Variables”.This function is unsafe for statement-based replication. A warning is logged if you use this function when
binlog_formatis set toSTATEMENT.mysql> SELECT VERSION(); -> '8.0.3-standard'
if you want to perform a complex benchmark, you need to put doble quotes around your expression:
SELECT BENCHMARK(1000000, "ENCODE('hello','goodbye')");
And remember to but a SELECT in front of BENCHMARK.
The word "may" seems to be an understatement. Everytime I run a SELECT with LIMIT, FOUND_ROWS() returns whatever number I put after LIMIT. E.g. after
SELECT * FROM table LIMIT 50
FOUND_ROWS() will return 50.
But if I do
SELECT * FROM table LIMIT 10, 10,
FOUND_ROWS() will return 20 though. :)
This is annoying, since I need this information from a 20,000-row table fulltext search, and a 0,008 second search then suddenly takes about 20 seconds... Haven't found a workaround yet...
SELECT * FROM table LIMIT 50
FOUND_ROWS() will return 50 cause it actually found 50 entries in the table before it stopped and returned the result
But if I do
SELECT * FROM table LIMIT 10, 10,
FOUND_ROWS() will return 20 cause it had to find the first 10 you skipped over, then the second 10 it returned to you, so it found 20 entries before stopping and giving you the result
SELECT * FROM table LIMIT 10, 10,
FOUND_ROWS() will return 20
If rows are counted from the client, the "expected" number of rows can be calcualted. This, of course, requires that the result set is passed to the client.
manual says:
"... The intent of SQL_CALC_FOUND_ROWS for UNION is that it should return the row count that would be returned without a global LIMIT."
though that means 'select * from tableX limit 50' returns 50 as a result of 'Found_rows()' just because tableX has 50 records, and 'select * from tableX limit 10,10' will return also 50 and not 10 or 20 as a result!
and don't forget use SQL_CALC_FOUND_ROWS modifier.
To overcome this, one can use this method:
1) Create a table with two columns: First is auto_incremented primary key. The second, is unique int.
CREATE TABLE IF NOT EXISTS `sequence` (
`id` int(11) NOT NULL auto_increment,
`value` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `value` (`value`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
2) Then, use the replace statement to increment the id column. (The unique index on value makes sure that the single row is being deleted and new one is inserted)
REPLACE INTO `sequence` set value=1
3) Use LAST_INSERT_ID() to get the newly inserted Id.
Now, using the auto_increment_offset and the auto_increment_increment server varaiables listed here, http://dev.mysql.com/doc/refman/5.0/en/replication-options-master.html#sysvar_auto_increment_increment, you can make sure that auto increment values on the replicated machines will not overlap (i.e odd, and even), and the sequence will work smoothly.
Lior Ben-Kereth
I know this might sound obvious, but I had huge performance problems on a production database just because of putting the "FROM".
Here is the blog post that helped me fix the issue on my code: http://uwstopia.nl/blog/2009/02/mysql-last-insert-id-performance-issues
My mistake was, that I deallocated the statement before I executed ROW_COUNT().
Example 1:
1. EXECUTE statement
2. DEALLOCATE statement
3. ROW_COUNT()
doesn't work.
Example 2:
1. EXECUTE statement,
2. ROW_COUNT()
3. DEALLOCATE statement
works like expected
It might be trivial, but I searched the whole web for this solution and I found none.
SELECT AUTO_INCREMENT FROM information_schema.`TABLES`
WHERE `table_schema` = 'DATABASE_NAME' AND `table_name` = 'TABLE_NAME';