php - MySQL - 设置外键以请求正确数据的新手

标签 php mysql phpmyadmin foreign-keys

在使用外键时遇到一些问题,我是 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/

相关文章:

mysql - 导入 XML PhpMyAdmin 错误 #1064

Python 列出依赖于 MySQL 用户和连接的函数

php - 插入到基于数组的表中

php - 如何显示:none of data row in a for each array?

php - SELECT * FROM help - 有 2 个变量选项

php - MySQL/PHP 中的记录集链接

MySQL 查询查找每组中重复次数最多的项目

mysql - 我可以下载 Phpmyadmin 数据库吗?

php - 在 php 中使用语句

php - 在 jQuery 弹出窗口中打开 PHP 文件,而不使用 iframe