[英]MySQL relating tables in the database
在我用来学习PHP和SQL的视频Tutoria /书中,作者解释了使数据库表相互关联的外键的概念。 如您在下图中所看到的,我们当前正在创建一个名为“ comments”的表。 在此SQL中,有一行photograph_id INT( 11 ) NOT NULL,
称为“外键”,作者说该行将“评论”表与现有的“照片”表相关。
我的问题是,由于表称为“ photographs”(复数为s),但是sql外键为“ photograph_id”,SQL如何将两者连接起来? “ photograph_id”的确切含义是什么,它允许MySQL将其与“ photographs”表关联。
+-----------------------------+
| Tables_in_C263430_quoralist |
+-----------------------------+
| photographs |
| users |
+-----------------------------+
2 rows in set (0.21 sec)
mysql> CREATE TABLE comments (
-> id INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> photograph_id INT( 11 ) NOT NULL,
-> created DATETIME NOT NULL,
-> author VARCHAR( 255 ) NOT NULL,
-> body TEXT NOT NULL
-> );
MySQL不会自动“连接”这两个表,您必须自己做:
CREATE TABLE comments (
id INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY,
photograph_id INT( 11 ) NOT NULL,
created DATETIME NOT NULL,
author VARCHAR( 255 ) NOT NULL,
body TEXT NOT NULL,
FOREIGN KEY (`photograph_id`) REFERENCES `photographs` (`id`) ON DELETE CASCADE
);
这将告诉MySQL您的表comments
具有外键。 您没有为键指定名称,因此mysql将自行选择名称。 它们的键在该表的“ photograph_id
”列上。 键是指表格中的photographs
,其列id
。
也许作者的意思是您使用该列来“模拟”外键,这意味着您可以使用该键连接到照片的主键,而无需真正添加外键约束。 因此,数据库管理员您知道该字段用于关联,但是数据库本身不使用该字段(因此不会检查该字段的完整性:您可以为不存在的照片添加注释)。
照片表可能如下所示:
photograph_id image_path
========================================
34343 /images/img_343.jpg
34344 /images/img_344.jpg
34345 /images/img_345.jpg
34346 /images/img_346.jpg
34347 /images/img_347.jpg
这是存储在数据库中的一组照片文件名。 请注意,有些人还诉诸于将照片本身以BLOB格式存储在数据库中。
创建注释记录后,SQL将指定上面的哪些照片记录用于该照片。
外键字段的实际名称无关紧要; 它主要用于文档。 对于表,通常的命名约定是它们是每行代表的复数形式,而列名是单数形式。
通过在从属表(在您的示例中为注释)中指定外键约束,将表绑定在一起。 请注意,用于每个表的存储引擎会影响外键约束是否由系统强制执行。 默认的MyISAM存储引擎不强制限制; InnoDB存储引擎可以。
@Michael:正如@Konerak所说,您必须自己指定。 默认情况下,MySQL使用MyISAM
引擎创建表,对于该表, FOREIGN KEY
子句将被忽略。 您的两个表都必须是InnoDB
。 我建议您也对MySQL中的外键和引用完整性进行一下介绍-http: //www.techrepublic.com/article/an-introduction-to-foreign-keys-and-referential-integrity-in- mysql / 6035435
您必须通过定义外键来告诉它。 语法如下:
ALTER TABLE comments ADD CONSTRAINT fk_photgraph_id FOREIGN KEY (photograph_id) REFERENCES photographs (id)
(您可以在CREATE TABLE
语句中一次执行相同的操作,但是我更喜欢上面的方法,因为这样您可以先创建所有表,然后添加外键,而不必担心正确的顺序)。
这将告诉MySQL, comments
表中的photograph_id
列链接到photographs
表中的id
列。 从那时起,MySQL将为您检查是否有任何photograph_id
与有效的photographs.id
相关联; 通过添加ON UPDATE
和ON DELETE
语句,您可以控制其执行的精确度-例如,如果指定ON DELETE CASCADE
,则删除照片还将删除所有引用该照片的注释; ON DELETE SET NULL
会将注释的photograph_id
设置为NULL; ON DELETE NO ACTION
所有评论或将其分配给另一张照片之前,“不删除ON DELETE NO ACTION
和“ ON DELETE RESTRICT
将拒绝删除照片。 级联删除功能非常强大,因此在使用它们时要小心。 您可能删除的东西超出了您的预期,并且数据库没有“撤消”按钮。
需要记住的重要一点是,MySQL中的外键仅适用于InnoDB存储引擎。 MyISAM不支持外键。 如果在MyISAM表上指定外键,MySQL将很乐意对其进行解析,然后忽略它而不会引发任何错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.