Table 12.21 Miscellaneous Functions
| Name | Description |
|---|---|
DEFAULT() | Return the default value for a table column |
GET_LOCK() | Get a named lock |
INET_ATON() | Return the numeric value of an IP address |
INET_NTOA() | Return the IP address from a numeric value |
IS_FREE_LOCK() | Whether the named lock is free |
IS_USED_LOCK() | Whether the named lock is in use; return connection identifier if true |
MASTER_POS_WAIT() | Block until the slave has read and applied all updates up to the specified position |
NAME_CONST() | Causes the column to have the given name |
RAND() | Return a random floating-point value |
RELEASE_LOCK() | Releases the named lock |
SLEEP() | Sleep for a number of seconds |
UUID() | Return a Universal Unique Identifier (UUID) |
UUID_SHORT() | Return an integer-valued universal identifier |
VALUES() | Defines the values to be used during an INSERT |
Returns the default value for a table column. An error results if the column has no default value.
mysql> UPDATE t SET i = DEFAULT(i)+1 WHERE id < 100;
Formats the number X to a format
like '#,###,###.##', rounded to
D decimal places, and returns the
result as a string. For details, see
Section 12.5, “String Functions”.
Tries to obtain a lock with a name given by the string
str, using a timeout of
timeout seconds. Before MySQL
5.5.8, a negative timeout value
means infinite timeout on Windows. As of 5.5.8, this behavior
applies on all platforms.
Returns 1 if the lock was obtained
successfully, 0 if the attempt timed out
(for example, because another client has previously locked the
name), or NULL if an error occurred (such
as running out of memory or the thread was killed with
mysqladmin kill).
A lock obtained with GET_LOCK()
is released explicitly by executing
RELEASE_LOCK() or implicitly
when your session terminates (either normally or abnormally).
Locks obtained with GET_LOCK()
are not released when transactions commit or roll back.
The behavior of GET_LOCK()
changes in MySQL 5.7. In consideration of future upgrades,
limit the str value to 64
characters or less and do not rely on subsequent calls to
GET_LOCK() releasing previous
locks.
GET_LOCK() can be used to
implement application locks or to simulate record locks. Names
are locked on a server-wide basis. If a name has been locked
within one session, GET_LOCK()
blocks any request by another session for a lock with the same
name. This enables clients that agree on a given lock name to
use the name to perform cooperative advisory locking. But be
aware that it also enables a client that is not among the set
of cooperating clients to lock a name, either inadvertently or
deliberately, and thus prevent any of the cooperating clients
from locking that name. One way to reduce the likelihood of
this is to use lock names that are database-specific or
application-specific. For example, use lock names of the form
db_name.str or
app_name.str.
mysql>SELECT GET_LOCK('lock1',10);-> 1 mysql>SELECT IS_FREE_LOCK('lock2');-> 1 mysql>SELECT GET_LOCK('lock2',10);-> 1 mysql>SELECT RELEASE_LOCK('lock2');-> 1 mysql>SELECT RELEASE_LOCK('lock1');-> NULL
The second RELEASE_LOCK() call
returns NULL because the lock
'lock1' was automatically released by the
second GET_LOCK() call.
If multiple clients are waiting for a lock, the order in which they will acquire it is undefined. Applications should not assume that clients will acquire the lock in the same order that they issued the lock requests.
Before MySQL 5.5.3, if a client attempts to acquire a lock
that is already held by another client, it blocks according
to the timeout argument. If the
blocked client terminates, its thread does not die until the
lock request times out.
GET_LOCK() is unsafe for
statement-based replication. Beginning with MySQL 5.5.1, a
warning is logged if you use this function when
binlog_format is set to
STATEMENT. (Bug #47995)
Given the dotted-quad representation of an IPv4 network
address as a string, returns an integer that represents the
numeric value of the address in network byte order (big
endian). INET_ATON() returns
NULL if it does not understand its
argument.
mysql> SELECT INET_ATON('10.0.5.9');
-> 167773449
For this example, the return value is calculated as 10×2563 + 0×2562 + 5×256 + 9.
INET_ATON() may or may not
return a non-NULL result for short-form IP
addresses (such as '127.1' as a
representation of '127.0.0.1'). Because of
this, INET_ATON()a should not
be used for such addresses.
To store values generated by
INET_ATON(), use an
INT UNSIGNED column rather than
INT, which is signed. If you
use a signed column, values corresponding to IP addresses
for which the first octet is greater than 127 cannot be
stored correctly. See
Section 11.2.6, “Out-of-Range and Overflow Handling”.
Given a numeric IPv4 network address in network byte order,
returns the dotted-quad representation of the address as a
string. INET_NTOA() returns
NULL if it does not understand its
argument.
As of MySQL 5.5.3, the return value is a nonbinary string in the connection character set. Before 5.5.3, the return value is a binary string.
mysql> SELECT INET_NTOA(167773449);
-> '10.0.5.9'
Checks whether the lock named str
is free to use (that is, not locked). Returns
1 if the lock is free (no one is using the
lock), 0 if the lock is in use, and
NULL if an error occurs (such as an
incorrect argument).
This function is unsafe for statement-based replication.
Beginning with MySQL 5.5.1, a warning is logged if you use
this function when
binlog_format is set to
STATEMENT. (Bug #47995)
Checks whether the lock named str
is in use (that is, locked). If so, it returns the connection
identifier of the client session that holds the lock.
Otherwise, it returns NULL.
This function is unsafe for statement-based replication.
Beginning with MySQL 5.5.1, a warning is logged if you use
this function when
binlog_format is set to
STATEMENT. (Bug #47995)
MASTER_POS_WAIT(
log_name,log_pos[,timeout])
This function is useful for control of master/slave
synchronization. It blocks until the slave has read and
applied all updates up to the specified position in the master
log. The return value is the number of log events the slave
had to wait for to advance to the specified position. The
function returns NULL if the slave SQL
thread is not started, the slave's master information is not
initialized, the arguments are incorrect, or an error occurs.
It returns -1 if the timeout has been
exceeded. If the slave SQL thread stops while
MASTER_POS_WAIT() is waiting,
the function returns NULL. If the slave is
past the specified position, the function returns immediately.
If a timeout value is specified,
MASTER_POS_WAIT() stops waiting
when timeout seconds have elapsed.
timeout must be greater than 0; a
zero or negative timeout means no
timeout. The lock is exclusive. While held by one session,
other sessions cannot obtain a lock of the same name.
This function is unsafe for statement-based replication.
Beginning with MySQL 5.5.1, a warning is logged if you use
this function when
binlog_format is set to
STATEMENT. (Bug #47995)
Returns the given value. When used to produce a result set
column, NAME_CONST() causes the
column to have the given name. The arguments should be
constants.
mysql> SELECT NAME_CONST('myname', 14);
+--------+
| myname |
+--------+
| 14 |
+--------+
This function is for internal use only. The server uses it when writing statements from stored programs that contain references to local program variables, as described in Section 20.7, “Binary Logging of Stored Programs”, You might see this function in the output from mysqlbinlog.
For your applications, you can obtain exactly the same result as in the example just shown by using simple aliasing, like this:
mysql> SELECT 14 AS myname;
+--------+
| myname |
+--------+
| 14 |
+--------+
1 row in set (0.00 sec)
See Section 13.2.9, “SELECT Syntax”, for more information about column aliases.
Releases the lock named by the string
str that was obtained with
GET_LOCK(). Returns
1 if the lock was released,
0 if the lock was not established by this
thread (in which case the lock is not released), and
NULL if the named lock did not exist. The
lock does not exist if it was never obtained by a call to
GET_LOCK() or if it has
previously been released.
The DO statement is convenient
to use with RELEASE_LOCK(). See
Section 13.2.3, “DO Syntax”.
This function is unsafe for statement-based replication.
Beginning with MySQL 5.5.1, a warning is logged if you use
this function when
binlog_format is set to
STATEMENT. (Bug #47995)
Sleeps (pauses) for the number of seconds given by the
duration argument, then returns 0.
If SLEEP() is interrupted, it
returns 1. The duration may have a fractional part.
When sleep returns normally (without interruption), it returns 0:
mysql> SELECT SLEEP(1000);
+-------------+
| SLEEP(1000) |
+-------------+
| 0 |
+-------------+
When SLEEP() is the only thing
invoked by a query that is interrupted, it returns 1 and the
query itself returns no error. This statement is interrupted
using KILL
QUERY from another session:
mysql> SELECT SLEEP(1000);
+-------------+
| SLEEP(1000) |
+-------------+
| 1 |
+-------------+
When SLEEP() is only part of a
query that is interrupted, the query returns an error. This
statement is interrupted using
KILL QUERY
from another session:
mysql> SELECT 1 FROM t1 WHERE SLEEP(1000);
ERROR 1317 (70100): Query execution was interrupted
This function is unsafe for statement-based replication.
Beginning with MySQL 5.5.1, a warning is logged if you use
this function when
binlog_format is set to
STATEMENT. (Bug #47995)
Returns a Universal Unique Identifier (UUID) generated according to RFC 4122, “A Universally Unique IDentifier (UUID) URN Namespace” (http://www.ietf.org/rfc/rfc4122.txt).
A UUID is designed as a number that is globally unique in
space and time. Two calls to
UUID() are expected to generate
two different values, even if these calls are performed on two
separate devices not connected to each other.
Although UUID() values are
intended to be unique, they are not necessarily unguessable
or unpredictable. If unpredictability is required, UUID
values should be generated some other way.
UUID() returns a value that
conforms to UUID version 1 as described in RFC 4122. The value
is a 128-bit number represented as a utf8
string of five hexadecimal numbers in
aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
format:
The first three numbers are generated from the low, middle, and high parts of a timestamp. The high part also includes the UUID version number.
The fourth number preserves temporal uniqueness in case the timestamp value loses monotonicity (for example, due to daylight saving time).
The fifth number is an IEEE 802 node number that provides spatial uniqueness. A random number is substituted if the latter is not available (for example, because the host device has no Ethernet card, or it is unknown how to find the hardware address of an interface on the host operating system). In this case, spatial uniqueness cannot be guaranteed. Nevertheless, a collision should have very low probability.
The MAC address of an interface is taken into account only on FreeBSD and Linux. On other operating systems, MySQL uses a randomly generated 48-bit number.
mysql> SELECT UUID();
-> '6ccd780c-baba-1026-9564-5b8c656024db'
UUID() does not work with
statement-based replication.
Returns a “short” universal identifier as a
64-bit unsigned integer. Values returned by
UUID_SHORT() differ from the
string-format 128-bit identifiers returned by the
UUID() function and have
different uniqueness properties. The value of
UUID_SHORT() is guaranteed to
be unique if the following conditions hold:
The server_id value of
the current server is between 0 and 255 and is unique
among your set of master and slave servers
You do not set back the system time for your server host between mysqld restarts
You invoke UUID_SHORT() on
average fewer than 16 million times per second between
mysqld restarts
The UUID_SHORT() return value
is constructed this way:
(server_id & 255) << 56 + (server_startup_time_in_seconds << 24) + incremented_variable++;
mysql> SELECT UUID_SHORT();
-> 92395783831158784
UUID_SHORT() does not work
with statement-based replication.
In an
INSERT
... ON DUPLICATE KEY UPDATE statement, you can use
the
VALUES(
function in the col_name)UPDATE clause
to refer to column values from the
INSERT portion of the
statement. In other words,
VALUES(
in the col_name)UPDATE clause refers to
the value of col_name that would be
inserted, had no duplicate-key conflict occurred. This
function is especially useful in multiple-row inserts. The
VALUES() function is meaningful
only in the ON DUPLICATE KEY UPDATE clause
of INSERT statements and
returns NULL otherwise. See
Section 13.2.5.3, “INSERT ... ON DUPLICATE KEY UPDATE Syntax”.
mysql>INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)->ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);