Apendice E Palabras reservadas en MySQL

Este apéndice es una traducción del manual de MySQL.

Un problema frecuente se deriva del intento de usar como identificador de una tabla o columna un nombre que se usa internamente por MySQL como nombre de dato o función, como TIMESTAMP o GROUP. Está permitido hacer esto (por ejemplo, ABS está permitido como nombre de columna). Sin embargo, por defecto, no se permiten espacios en blanco en las llamadas a función entre el nombre de la función y el paréntesis '('. Esta característica permite distinguir una llamada a función de una referencia a un nombre de columna.

Un efecto secundario de este comportamiento es que la omisión de un espacio en algunos contextos haga que un identificador sea interpretado como un nombre de función. Por ejemplo, esta sentencia es legal:

mysql> CREATE TABLE abs (val INT);

Pero si se omite el espacio después de 'abs' se produce un error de sintaxis porque entonces la sentencia parece que invoque a la función ABS():

mysql> CREATE TABLE abs(val INT);

Si el modo del servidor SQL incluye el valor de modo IGNORE_SPACE, el servidor permite que las llamadas a función puedan tener espacios entre el nombre de la función y el paréntesis. Esto hace que los nombres de la funciones se traten con palabras reservadas. Como resultado, los identificadores que sean iguales que nombres de funciones deben ser entrecomillados como se describe en el apéndice reglas para nombres.

Las palabras de la tabla siguiente son palabras reservadas explícitamente en MySQL. Muchas de ellas están prohibidas por SQL estándar como nombres de columna y/o tabla (por ejemplo, GROUP). Algunas son reservadas porque MySQL las necesita y (frecuentemente) usa un analizador sintáctico yacc. Una palabra reservada puede usarse como identificador si se entrecomilla.

Palabra Palabra Palabra
ADD ALL ALTER
ANALYZE AND AS
ASC ASENSITIVE BEFORE
BETWEEN BIGINT BINARY
BLOB BOTH BY
CALL CASCADE CASE
CHANGE CHAR CHARACTER
CHECK COLLATE COLUMN
CONDITION CONNECTION CONSTRAINT
CONTINUE CONVERT CREATE
CROSS CURRENT_DATE CURRENT_TIME
CURRENT_TIMESTAMP CURRENT_USER CURSOR
DATABASE DATABASES DAY_HOUR
DAY_MICROSECOND DAY_MINUTE DAY_SECOND
DEC DECIMAL DECLARE
DEFAULT DELAYED DELETE
DESC DESCRIBE DETERMINISTIC
DISTINCT DISTINCTROW DIV
DOUBLE DROP DUAL
EACH ELSE ELSEIF
ENCLOSED ESCAPED EXISTS
EXIT EXPLAIN FALSE
FETCH FLOAT FOR
FORCE FOREIGN FROM
FULLTEXT GOTO GRANT
GROUP HAVING HIGH_PRIORITY
HOUR_MICROSECOND HOUR_MINUTE HOUR_SECOND
IF IGNORE IN
INDEX INFILE INNER
INOUT INSENSITIVE INSERT
INT INTEGER INTERVAL
INTO IS ITERATE
JOIN KEY KEYS
KILL LEADING LEAVE
LEFT LIKE LIMIT
LINES LOAD LOCALTIME
LOCALTIMESTAMP LOCK LONG
LONGBLOB LONGTEXT LOOP
LOW_PRIORITY MATCH MEDIUMBLOB
MEDIUMINT MEDIUMTEXT MIDDLEINT
MINUTE_MICROSECOND MINUTE_SECOND MOD
MODIFIES NATURAL NOT
NO_WRITE_TO_BINLOG NULL NUMERIC
ON OPTIMIZE OPTION
OPTIONALLY OR ORDER
OUT OUTER OUTFILE
PRECISION PRIMARY PROCEDURE
PURGE READ READS
REAL REFERENCES REGEXP
RENAME REPEAT REPLACE
REQUIRE RESTRICT RETURN
REVOKE RIGHT RLIKE
SCHEMA SCHEMAS SECOND_MICROSECOND
SELECT SENSITIVE SEPARATOR
SET SHOW SMALLINT
SONAME SPATIA SPECIFIC
SQL SQLEXCEPTION SQLSTATE
SQLWARNING SQL_BIG_RESULT SQL_CALC_FOUND_ROWS
SQL_SMALL_RESULT SSL STARTING
STRAIGHT_JOIN TABLE TERMINATED
THEN TINYBLOB TINYINT
TINYTEXT TO TRAILING
TRIGGER TRUE UNDO
UNION UNIQUE UNLOCK
UNSIGNED UPDATE USAGE
USE USING UTC_DATE
UTC_TIME UTC_TIMESTAMP VALUES
VARBINARY VARCHAR VARCHARACTER
VARYING WHEN WHERE
WHILE WITH WRITE
XOR YEAR_MONTH ZEROFILL

MySQL permite que algunas palabras reservadas sean usadas como identificadores sin entrecomillar porque mucha gente ya las usa. Ejemplos de esas palabras son las siguientes:

ACTION
BIT
DATE
ENUM
NO
TEXT
TIME
TIMESTAMP