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.
