我正在玩一些想法。基本上我想要一个外键但我想要使用该键的表也应该在行中。这样外键可以引用不同的表。通常,您只需从任何需要取消引用此指针的查询中返回一个结果。
我知道我可以只存储表名并使用两个select语句来执行此操作,插入第一个select的结果以获取表并键入下一个调用索引右表,但是可以使用在数据库上单一选择? sql会是什么样的?
编辑:让我看看我是否可以提出一个例子。 MediaTable ID |名称|业主|输入|的Fkey
MP3 ID |艺术家|专辑|标题| BitRate |编解码器|数据
电影 ID |标题|分辨率| imdbUrl | AudioCodec | VideoCodec |数据
OK设计但是... leta说我想在MediaTable中搜索所有标题(在Mp3或电影表中),其中MediaTable.Owner =" ekl"假设FKey是ID字段的外键。 Can" MediaTable.type"选择FKey应该应用于哪个表?
是的,我知道这不是做这个特定例子的最好方法,但它比解释两个我想要的大项目更容易。
答案 0 :(得分:0)
基本上,您要做的是参数化外键并添加要引用的表。
理论上,它可以通过字符串连接查询并一次执行来完成。但是,获取组件字符串可能需要多次调用或过程调用。
尽管理论上可行,但我想提醒一下,您尝试做的事情是非常不同寻常的,导致代码变慢(由于字符串连接)和不可维护。< / p>
答案 1 :(得分:0)
外键不仅仅是在插入时验证数据的完整性。您得到SELECT
后得到的任何列都是因为您在执行SELECT
时明确要求它,而不是因为数据库自动跟随外键引用。如果你有充分的理由,你可以在不使用任何FK约束的情况下设计整个模式,并且它可以正常工作。
因此,如果要一次搜索多个表,则需要从这些表中明确选择。在您的示例中,可以使用UNION
:
SELECT mt.fkey, mt.owner, mt.type, media.title
FROM mediatable mt INNER JOIN
(SELECT id, 'MP3' AS type, title FROM mp3
UNION
SELECT id, 'MOVIE', title FROM movie) media
ON mt.fkey = media.id AND mt.type = media.type
WHERE mt.owner = 'ekl';