Bei MySQL unterstützen InnoDB
-Tabellen die
Überprüfung von Fremdschlüsselbeschränkungen. Siehe auch
Abschnitt 14.2, „InnoDB
-Tabellen“, und
Abschnitt 1.9.5.5, „Fremdschlüssel“.
Eine Fremdschlüsselbeschränkung ist nicht erforderlich, wenn
Sie lediglich zwei Tabellen miteinander verknüpfen wollen. Bei
anderen Speicher-Engines als InnoDB
ist dies
möglich, indem eine Spalte zur Verwendung einer
REFERENCES
-Klausel
definiert wird; diese hat keine eigentliche Wirkung und
dient Ihnen lediglich als Erinnerung oder Anmerkung,
damit Sie daran denken, dass die derzeit definierte Spalte auf
eine Spalte in einer anderen Tabelle verweisen soll.
Es ist bei Verwendung dieser Syntax extrem wichtig, sich zu
vergegenwärtigen, dass
tbl_name
(col_name
)
MySQL keinerlei Überprüfung durchführt, um
sicherzustellen, dass col_name
tatsächlich in tbl_name
vorhanden ist (bzw. dass tbl_name
selbst existiert),
MySQL keine Aktionen an tbl_name
– wie etwa das Löschen von Datensätzen – als Reaktion
auf Aktionen ausführt, die an Datensätzen in der von Ihnen
gerade definierten Tabelle vorgenommen werden (mit anderen
Worten, diese Syntax enthält keine Funktionalität wie etwa
ON DELETE
oder ON
UPDATE
; Sie können zwar eine ON
DELETE
- oder ON UPDATE
-Klausel
als Bestandteil der REFERENCES
-Klausel
schreiben, aber diese wird ebenfalls ignoriert),
diese Syntax eine Spalte erstellt (und keinerlei Index oder Schlüssel),
diese Syntax einen Fehler erzeugt, wenn damit eine
InnoDB
-Tabelle zu erzeugen versucht wird.
Sie können eine Spalte, die als Join-Spalte erstellt wurde, wie nachfolgend gezeigt verwenden:
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 | +----+-------+--------+-------+
Wenn sie auf diese Weise eingesetzt wird, wird die
REFERENCES
-Klausel in der Ausgabe von
SHOW CREATE TABLE
oder
DESCRIBE
nicht angezeigt:
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
Die Verwendung von REFERENCES
als derartigen
Kommentar oder „Erinnerung“ in einer
Spaltendefinition funktioniert sowohl mit
MyISAM
- als auch mit
BerkeleyDB
-Tabellen.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.