在使用外键时遇到一些问题,我是 MySQL 新手,所以请原谅。我不知道如何做我想做的事。
我有 4 张 table :
- 用户
- 任务
- 日
- 周(包括周数和开始日期)。
我想要做的是,引用每个表来提取正确的数据。
E.G. pseudo code:
find user liam, find select day associated with liam, find the task associated with the selected day, find the week from the selected day.
这应该允许我筛选数据。
以下是表格:
+------------+-----------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-----------------+------+-----+---------+----------------+
| user_id | int(1) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(255) | NO | UNI | NULL | |
| password | varchar(255) | NO | | NULL | |
| first_name | varchar(255) | NO | | NULL | |
| last_name | varchar(255) | NO | | NULL | |
| email | varchar(255) | NO | UNI | NULL | |
+------------+-----------------+------+-----+---------+----------------+
+------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------------+------+-----+---------+----------------+
| day_id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| day | varchar(255) | NO | | NULL | |
| user-id-fk | int(10) unsigned | NO | | NULL | |
+------------+------------------+------+-----+---------+----------------+
+-------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------------+------+-----+---------+----------------+
| am_id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| am_task | varchar(255) | NO | | NULL | |
| description | varchar(255) | NO | | NULL | |
| am_color | varchar(20) | YES | | NULL | |
+-------------+------------------+------+-----+---------+----------------+
+---------+-----------------+------+-----+------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-----------------+------+-----+------------+----------------+
| week_id | int(2) unsigned | NO | MUL | NULL | auto_increment |
| week | varchar(255) | NO | | NULL | |
| date | date | NO | | 2014-12-29 | |
+---------+-----------------+------+-----+------------+----------------+
因此,首先我知道我必须引用前两个表,这就是为什么我创建了一个名为“user-id-fk”的字段。 我尝试在 phpMyAdmin 内部创建外键:http://tinypic.com/r/mkar20/8
但不确定它是否正常工作或者我是否正确创建了它。 正如我已经说过的,我是 MySQL 的新手,所以即使我正确创建了它,我也不知道如何测试? 如果需要,我可以添加更多数据。
最佳答案
请注意,外键只是确保 SQL 中数据结构可靠的方法。从技术上讲,它们对于跨两个或多个表查询数据来说并不是必需的,只要您拥有两个表之间共有的键即可。
使用外键可以更轻松地确保您从受控列表中正确选择项目。但是,由于它们是好主意,因为它们可以确保数据库的完整性,因此测试它们的最简单方法是将这些键设置为 RESTRICT 并测试从具有外键的表中添加记录引用的表上不存在的限制 它应该提供错误。
例如,给出您的示例之一:
+------------+-----------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-----------------+------+-----+---------+----------------+
| user_id | int(1) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(255) | NO | UNI | NULL | |
| password | varchar(255) | NO | | NULL | |
| first_name | varchar(255) | NO | | NULL | |
| last_name | varchar(255) | NO | | NULL | |
| email | varchar(255) | NO | UNI | NULL | |
+------------+-----------------+------+-----+---------+----------------+
+------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------------+------+-----+---------+----------------+
| day_id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| day | varchar(255) | NO | | NULL | |
| user-id-fk | int(10) unsigned | NO | | NULL | |
+------------+------------------+------+-----+---------+----------------+
如果 user-id-fk
是第二个表上的外键,引用第一个表上的 user_id
,并且您将其设置为 restrict
,如果不在第一个表中输入相同的 user_id
,您将无法将任何记录添加到 user-id-fk
中。
假设第一个表上的 user_id 仅输入值 1、2 或 3。如果您尝试在第二个表中输入行4
,它应该会出错,因为第一个表上没有引用的键。
注意:
您为这些表创建了不同大小的整数,因此在输入 10 人后可能会遇到问题。我建议将 user_id
上的整数大小设置为大于 1。
关于php - MySQL - 设置外键以请求正确数据的新手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29457552/