视图是否需要自己的外键约束?


10

免责声明:我是程序员,而不是DBA,所以请耐心等待...

我有一种观点,我只是将2个实体映射在一起。我必须在几个不同的表之间进行联接才能得到:

CREATE OR REPLACE VIEW V_SCREENING_GROUP_SITES AS (
SELECT SG.SCREENING_GROUP_ID, V.SITE_ID
FROM SCREENING_GROUP SG, VISIT V, VISIT_DATE VD
WHERE VD.VISIT_ID = V.VISIT_ID 
AND V.SCREENING_GROUP_ID = SG.SCREENING_GROUP_ID);

以上仅是上下文,请不要为此担心太多。我需要知道的是如何使新的V_SCREENING_GROUP_SITES视图中的字段(SCREENING_GROUP_ID和SITE_ID)充当SCREENING_GROUP和SITE表的外键。还是有关系吗?

如果是一张桌子,我会做:

ALTER TABLE V_SCREENING_GROUP_SITES
ADD CONSTRAINT FK_SCREENING_GROUP_ID
FOREIGN KEY (SCREENING_GROUP_ID)
REFERENCES SCREENING_GROUP.SCREENING_GROUP_ID;
...

但是,由于这种观点显然行不通。我找不到可用于设置FK的ALTER VIEW语法。我该怎么办?

(这是一个MySQL数据库)

Answers:


12

视图是基于一个或多个物理表的逻辑表。如果基础表中有外键关系,则它们将显示在视图中。视图完全依赖于其派生的表,因此无法向其添加外键。


1
太好了,所以我不需要再做任何事情(基础表中已经存在FK约束)。感谢您的回答。
Troy

1
我认为这是重点。只要基础表具有FK,就不需要在视图上使用FK。
德里克·唐尼

2
@DTest-能够将约束(包括检查,唯一键和外键约束)应用于视图(特别是如果视图聚合数据)可能非常有用。碰巧,即使当前的RDBMS允许您创建视图,也没有对视图施加约束。
杰克说尝试topanswers.xyz 2011年

@JackDouglas完全正确!实际上,我来这里的目的是找出MySQL是否支持这种功能。
Stijn de Witt

3

从严格意义上讲,没有,您不能在视图上设置外键。原因如下:

InnoDB是MySQL唯一具有外键的内置存储引擎。任何InnoDB表都将使用engine ='InnoDB' 在information_schema.tables中注册。

视图在information_schema.tables中注册时,具有NULL存储引擎。MySQL中没有机制可以在任何具有未定义存储引擎的表上使用外键。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.