【问题标题】:Can you have a foreign table name like a foreign key?你能有一个像外键一样的外表名吗?
【发布时间】:2015-07-18 07:22:06
【问题描述】:

我正在玩一些想法。基本上我想要一个外键,但我希望应该使用该键的表也在行中。这样外键可以引用不同的表。通常,您只会从需要取消引用此“指针”的任何给定查询返回一个结果。

我知道我可以只存储表名并使用两个选择语句来执行此操作,将第一个选择的结果插入以获取表并将键插入下一个调用以索引正确的表,但可以用数据库上的单个选择? sql 会是什么样子?

编辑:让我看看我能不能举个例子。 媒体表 身份证 |姓名 |业主|类型 | FKey

MP3 身份证 |艺术家 |专辑 |标题 |比特率 |编解码器 |数据

电影 身份证 |标题 |分辨率 | imdbUrl |音频编解码器 |视频编解码器 |数据

好的,但是......假设我想在 MediaTable 中搜索所有标题(在 Mp3 或电影表中),其中 MediaTable.Owner = "ekl" 假设 FKey 是 ID 字段的外键。 “MediaTable.type”可以选择FKey应用到哪个表吗?

是的,我知道这不是做这个特定示例的最佳方法,但它比解释我想要的两个更大的项目更容易。

【问题讨论】:

  • 请使用示例数据编辑您的问题。我不确定我是否完全理解您的想法。

标签: sql


【解决方案1】:

基本上,您要做的是参数化外键并添加要引用的表。

理论上,可以通过字符串连接查询并一次性执行它来完成。但是,获取组件字符串可能需要多次调用或过程调用。

尽管理论上是可行的,但我想提醒您,您尝试做的事情非常不合常规,并导致代码运行缓慢(由于字符串连接)且不可维护。

【讨论】:

  • 过程调用听起来是一种有趣的方式。否则,您基本上会得到两个查询,对吧?一个用于确定哪个表,另一个用于构建最终查询。过程调用包装了讨厌的东西。我没想到!是的,我知道这是一个黑客攻击。
  • 您可能会觉得这很有帮助:stackoverflow.com/questions/441001/…
【解决方案2】:

因此,外键除了在插入时验证数据的完整性外,并没有做更多的事情。由于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';

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
相关资源
最近更新 更多