如何查询外键对应关系是一对一,还是一对多

三碗猪脚 2014-09-28 01:28:15
如题,不是查询外键信息。



如图,pd中的Cardinality中的信息怎么在数据库查询得到
...全文
472 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
三碗猪脚 2014-09-29
  • 打赏
  • 举报
回复
高手,一语惊醒梦中人啊!
还在加载中灬 2014-09-29
  • 打赏
  • 举报
回复
你的代码,我没有发现问题 我觉得是语意的问题,parent_object_id在foreign_key_columns的意思应该是这些"索引"对象的父表是谁,那自然是stuInfo 而不是说student,class,grade的父表是stuInfo
三碗猪脚 2014-09-29
  • 打赏
  • 举报
回复
呵呵,我在做一个类似于SqlMetal的工具,所以要研究一下,其实可以说合理也可以说不合理, 一般不会这样做,但实际开发还可以的,比如要存储的字段非常多,一部分常用很少的字段单独用表,还有很多信息不常用放到另外一张表中,仔细研究一下生成的代码最后发现实际是这样,似乎数据库的系统表中没有这样的关系,而是如你所说,是SqlMetal判断的结果,如果A表中的主键与外键是同一字段,判定为一对一的关系,如果附键不是主键SqlMetal判定是一对多关系,与PD中的设置没有关系。 还有一个问题请教楼上的兄弟: PD中的,PartentTable在数所库中却变成了儿子关系了, 箭头指向的父表,如上图,和主题中的图,但在查询分析器中却是如下 查询代码:


SELECT a.*, b.name AS refTable,c.name AS parTable,d.name AS subCol,e.name AS parCol,'0' AS chk 
   FROM sys.foreign_key_columns a
   LEFT JOIN sys.objects b ON b.object_id=a.referenced_object_id
   LEFT JOIN sys.objects c ON c.object_id=a.parent_object_id
   LEFT JOIN sys.columns d ON a.referenced_object_id=d.object_id AND a.referenced_column_id=d.column_id
   LEFT JOIN sys.columns e ON a.parent_object_id =e.object_id AND a.parent_column_id=e.column_id
    WHERE a.parent_object_id=OBJECT_ID('stuInfo')
最后结果如图 好像父子关系,PD中与SQL中是不是反过来了,还是我的代码有什么问题
还在加载中灬 2014-09-29
  • 打赏
  • 举报
回复
引用 7 楼 rovecat 的回复:
楼上说的有一定道理,但会不会出出如下情形 A表的主键与外键不是同一字段, A表的外键是B表的主键, A表与B表是一对一关系。
这个...且不管设计合不合理, 你试过,这样的关系,SqlMetal生成后的结果吗?
三碗猪脚 2014-09-29
  • 打赏
  • 举报
回复
楼上说的有一定道理,但会不会出出如下情形 A表的主键与外键不是同一字段, A表的外键是B表的主键, A表与B表是一对一关系。
还在加载中灬 2014-09-28
  • 打赏
  • 举报
回复
SqlMetal不是根据这几对几来生成的,应该是根据表外键关系来判定的, 如果一个表的主键是另外一个表的主键而且那个表没有其他的主键,那自然是一对一 如果一个表的主键是另外一个表的主键而那个表存在其他的主键,那自然是一对多
三碗猪脚 2014-09-28
  • 打赏
  • 举报
回复
应当能查询到,要不然,sqlmeaal怎么生成代码文件的
Alessandro_ 2014-09-28
  • 打赏
  • 举报
回复
xiaodongni 2014-09-28
  • 打赏
  • 举报
回复
这个不是设置关系吧。感觉。你在字表的外键列设置一个唯一索引就是1对1 了。不然都可能是1对多
三碗猪脚 2014-09-28
  • 打赏
  • 举报
回复
肯定是能看到的,你如果使用SqlMetal工具生成,根据外键的对应关系,有如下规则
引用
EntitySet类:设置外键的实体 与EntityRef结合-->EntityRef引用外键的实体 ·一对多 1在M端:以EntityRef形式出现 M在1端:以EntitySet形式出现 ·一对一 在各自的类中,均以EntityRef出现
如果Sqlmetal不知道是一对一还是一对多,它怎么知道是用EntityRef,还是EntitySet呢!
KeepSayingNo 2014-09-28
  • 打赏
  • 举报
回复
对应关系指的是两个表中的记录的一种关系,外键指的的一个表的某个字段是另外一个表的主键,通过这种规约,实现这个表中的数据的该字段必须在另外一个表有。所以说你说的一对一、一对多这种对象对应关系只能让开发者明确这种关系,不能像你说的在哪里看到

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧