En MySQL, las tablas InnoDB
soportan
restricciones de claves foráneas. Consulte
Capítulo 15, El motor de almacenamiento InnoDB
. Consulte también
Sección 1.7.5.5, “Claves foráneas (foreign keys)”.
No se requiere una restricción de clave foránea para
simplemente unir dos tablas. Para otros tipos de tabla que no
sean InnoDB
, es posible, al momento de
definir una columna, utilizar una cláusula
REFERENCES
, la cual no
tiene efecto real y funciona solamente como un
recordatorio o comentario de que la columna que se está
definiendo está dirigida a hacer referencia a una columna en
otra tabla. Al emplear esta sintaxis es muy
importante comprender que:
tbl_name
(col_name
)
MySQL no efectúa ningún tipo de CHECK
o
comprobación para asegurarse de que
col_name
realmente existe en
tbl_name
(o incluso que
tbl_name
existe).
MySQL no realiza ningún tipo de acción sobre
tbl_name
tal como borrar filas en
respuesta a acciones ejecutadas sobre filas en la tabla que
se está definiendo; en otras palabras, esta sintaxis no
produce por sí misma un comportamiento ON
DELETE
u ON UPDATE
. (Inclusive
cuando se puede escribir una cláusula ON
DELETE
u ON UPDATE
como parte
de la cláusula REFERENCES
, estas son
también ignoradas).
Esta sintaxis crea una columna; no crea ninguna clase de índice o campo clave.
Esta sintaxis causará un error si se la emplea durante la
definición de una tabla InnoDB
.
Una columna creada de esta forma se puede utilizar como columna de unión, como se muestra aquí:
CREATE TABLE person ( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, name CHAR(60) NOT NULL, PRIMARY KEY (id) ); CREATE TABLE shirt ( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, style ENUM('t-shirt', 'polo', 'dress') NOT NULL, color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL, owner SMALLINT UNSIGNED NOT NULL REFERENCES person(id), PRIMARY KEY (id) ); INSERT INTO person VALUES (NULL, 'Antonio Paz'); SELECT @last := LAST_INSERT_ID(); INSERT INTO shirt VALUES (NULL, 'polo', 'blue', @last), (NULL, 'dress', 'white', @last), (NULL, 't-shirt', 'blue', @last); INSERT INTO person VALUES (NULL, 'Lilliana Angelovska'); SELECT @last := LAST_INSERT_ID(); INSERT INTO shirt VALUES (NULL, 'dress', 'orange', @last), (NULL, 'polo', 'red', @last), (NULL, 'dress', 'blue', @last), (NULL, 't-shirt', 'white', @last); SELECT * FROM person; +----+---------------------+ | id | name | +----+---------------------+ | 1 | Antonio Paz | | 2 | Lilliana Angelovska | +----+---------------------+ SELECT * FROM shirt; +----+---------+--------+-------+ | id | style | color | owner | +----+---------+--------+-------+ | 1 | polo | blue | 1 | | 2 | dress | white | 1 | | 3 | t-shirt | blue | 1 | | 4 | dress | orange | 2 | | 5 | polo | red | 2 | | 6 | dress | blue | 2 | | 7 | t-shirt | white | 2 | +----+---------+--------+-------+ SELECT s.* FROM person p, shirt s WHERE p.name LIKE 'Lilliana%' AND s.owner = p.id AND s.color <> 'white'; +----+-------+--------+-------+ | id | style | color | owner | +----+-------+--------+-------+ | 4 | dress | orange | 2 | | 5 | polo | red | 2 | | 6 | dress | blue | 2 | +----+-------+--------+-------+
Cuando se usa de esta manera, la cláusula
REFERENCES
no es mostrada en la salida de
SHOW CREATE TABLE
o
DESCRIBE
:
SHOW CREATE TABLE shirt\G *************************** 1. row *************************** Table: shirt Create Table: CREATE TABLE `shirt` ( `id` smallint(5) unsigned NOT NULL auto_increment, `style` enum('t-shirt','polo','dress') NOT NULL, `color` enum('red','blue','orange','white','black') NOT NULL, `owner` smallint(5) unsigned NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1
El uso de REFERENCES
como comentario o
"recordatorio" en la definición de una columna
funciona en tablas MyISAM
y
BerkeleyDB
.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.