如何理解解决 MyISAM FK 问题的方法?
How to understand a way to get around MyISAM FK issue?
大家好。
(我是一名兽医,本学期完成了 web/software 发展方面的 2 年副学士学位,并选择帮助当地的非营利组织来帮助我学习并帮助他们发挥作用。)
我正在为他们制作一个志愿者数据库,但他们仅限于共享主机,不幸的是,MyISAM 是必需的。
老实说,我的脑袋都被这个问题搞得焦头烂额了。在过去的两年里,我一直被教导基本上是 ACID = SQL(好吧,你知道,ACID 的目标应该用于任何数据库实现。)
以下是示例数据库 table 我正在尝试创建和使用:
Table: log
pk: pid
fk: task.pid
fk: volunteer.pid
好吧,我今晚才知道,MyISAM 不允许使用外键。我现在真的有点吓坏了嘿。我什至不知道如何解决这个问题并从这里开始。有什么办法可以让我在日志 table 和任务 table 中引用同一个志愿者?
目标是:
- 管理员将登录到管理控制台。
- 然后单击屏幕上已填充的志愿者列表。
- 显示该志愿者最近完成的所有任务。
这在 MyISAM 上可行吗?
如有任何帮助,我们将不胜感激。
关系模型的一个关键特征是元组(行)通过共同值彼此相关存储在列中。
从这个意义上讲,MyISAM 支持行之间的关系。
因此,要回答您的问题,是的,您可以在一列中有多个具有相同值的行。
所以,获取志愿者名单...
SELECT v.pid, v.name FROM volunteer v ORDER BY v.name
pid name
--- ------
43 Barney
24 Fred
为给定的志愿者显示 "all the latest tasks",假设它存储在 log
table...
SELECT t.id
, t.task_name
, l.log_date
FROM task t
JOIN log l
ON l.id = t.log_id
WHERE l.volunteer_id = 24
ORDER BY l.log_date DESC
MyISAM 不 支持声明性约束来强制 table 之间的完整性。
使用 InnoDB,当 [=15] 中不存在匹配行时,您可以确保没有值被放入 log
table 的 volunteer_id
列=] table。即volunteer
table的id
列有匹配值的行。如果您尝试使用具有 FOREIGN KEY 约束的 InnoDB tables 执行此操作,InnoDB (MySQL) 将 return 出错。
MyISAM 缺少的是这种强制 FOREIGN KEY
约束。 MyISAM 将让 INSERT/UPDATE 被执行。 MyISAM 不关心是否有匹配的行。
如果您需要使用 MyISAM 在数据库中强制执行完整性,那将成为应用程序的责任。应用程序需要检查要存储在 log
table 中的 volunteer_id
值是否有效...是否引用 volunteer
table 中的行, 并决定是继续运行还是停止运行。
但除了这个区别,SQL 是相同的,无论是 InnoDB 还是 MyISAM。
大家好。
(我是一名兽医,本学期完成了 web/software 发展方面的 2 年副学士学位,并选择帮助当地的非营利组织来帮助我学习并帮助他们发挥作用。)
我正在为他们制作一个志愿者数据库,但他们仅限于共享主机,不幸的是,MyISAM 是必需的。
老实说,我的脑袋都被这个问题搞得焦头烂额了。在过去的两年里,我一直被教导基本上是 ACID = SQL(好吧,你知道,ACID 的目标应该用于任何数据库实现。)
以下是示例数据库 table 我正在尝试创建和使用:
Table: log
pk: pid
fk: task.pid
fk: volunteer.pid
好吧,我今晚才知道,MyISAM 不允许使用外键。我现在真的有点吓坏了嘿。我什至不知道如何解决这个问题并从这里开始。有什么办法可以让我在日志 table 和任务 table 中引用同一个志愿者?
目标是:
- 管理员将登录到管理控制台。
- 然后单击屏幕上已填充的志愿者列表。
- 显示该志愿者最近完成的所有任务。
这在 MyISAM 上可行吗?
如有任何帮助,我们将不胜感激。
关系模型的一个关键特征是元组(行)通过共同值彼此相关存储在列中。
从这个意义上讲,MyISAM 支持行之间的关系。
因此,要回答您的问题,是的,您可以在一列中有多个具有相同值的行。
所以,获取志愿者名单...
SELECT v.pid, v.name FROM volunteer v ORDER BY v.name
pid name
--- ------
43 Barney
24 Fred
为给定的志愿者显示 "all the latest tasks",假设它存储在 log
table...
SELECT t.id
, t.task_name
, l.log_date
FROM task t
JOIN log l
ON l.id = t.log_id
WHERE l.volunteer_id = 24
ORDER BY l.log_date DESC
MyISAM 不 支持声明性约束来强制 table 之间的完整性。
使用 InnoDB,当 [=15] 中不存在匹配行时,您可以确保没有值被放入 log
table 的 volunteer_id
列=] table。即volunteer
table的id
列有匹配值的行。如果您尝试使用具有 FOREIGN KEY 约束的 InnoDB tables 执行此操作,InnoDB (MySQL) 将 return 出错。
MyISAM 缺少的是这种强制 FOREIGN KEY
约束。 MyISAM 将让 INSERT/UPDATE 被执行。 MyISAM 不关心是否有匹配的行。
如果您需要使用 MyISAM 在数据库中强制执行完整性,那将成为应用程序的责任。应用程序需要检查要存储在 log
table 中的 volunteer_id
值是否有效...是否引用 volunteer
table 中的行, 并决定是继续运行还是停止运行。
但除了这个区别,SQL 是相同的,无论是 InnoDB 还是 MyISAM。