sql server在同一张表中同时存在主键和外键互相关联是否可以?

为了实现层级关系,设计表如下:地区表地区ID地区名称上一级地区ID001山东省002青岛市001地区ID作为地区表的主键,上一级地区ID是地区表的外键,并关联地区表的主键... 为了实现层级关系,设计表如下:

地区表
地区ID 地区名称 上一级地区ID
001 山东省
002 青岛市 001

地区ID作为地区表的主键,上一级地区ID是地区表的外键,并关联地区表的主键地区ID
请问这样做是否可以?如果可以,那么在插入第一行数据的时候就会出现无上一级地区ID数据,这样是否就破坏了完整性约束了呢?请高数予以指教,非常感谢!
展开
 我来答
五十铃_兰
2018-04-13 · TA获得超过130个赞
知道小有建树答主
回答量:144
采纳率:77%
帮助的人:46.3万
展开全部
设计合理,但是请不要使用外键,个人建议,真实的开发环境很少会使用外键,外键约束是一种物理约束,在开发过程中如果更改了表结构,在有外键的情况下对于表的整改将会是一个非常大的工程,因此少建立物理约束。而且这样一个表完全不需要使用外键,人为的做约束是一种最常见的方式,比如前台的输入限制,或者先通过select检索出上级再让其输入下级的数据。题外话:ID最好使用sequence,要保证其唯一性。
匿名用户
2012-11-22
展开全部
父子结构, 是可以创建外键的.
例如:

1> CREATE TABLE test_tree (
2> test_id INT NOT NULL,
3> pid INT,
4> test_val VARCHAR(10),
5> PRIMARY KEY (test_id)
6> );
7> go
1> ALTER TABLE test_tree
2> ADD CONSTRAINT FK_test_tree
3> FOREIGN KEY (pid) REFERENCES test_tree(test_id);
4> go
1>

根节点 的 父节点 为空, 这个是很正常的情况啊.
否则怎么判断 根节点.

建立外键约束, 是可以避免 创建一个节点, 其 父节点是 不存在的节点.

也就是你不能创建一个 某某市, 上一级地区ID = 不存在的 ID
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
coolmenglong
2012-11-22 · 超过16用户采纳过TA的回答
知道答主
回答量:85
采纳率:0%
帮助的人:38.5万
展开全部
你可以分开成两个表,一个表只放省,一个表只放市,然后进行关联
追问
您的建议非常好,但是这样做的话,就会变的难以扩展,如果是地区还好说,笔毕竟层级数量是有限的,但是如果是其他类型的就麻烦了

比如:商品分类
一级类目
二级类目
三级类目
···

如果每一级类目做一张表,日后一旦需要增加一级类目,那就是需要再来一张表,那就完蛋了,程序还得改,所以这样做虽然解决了这个问题,却带来了更大的问题,有些得不偿失

不知道我理解的是否正确?
追答
额  对了  你这个可以实现的  就是那个父子的关系,你去看看数据库的递归就好了。不清楚的话 可以继续探讨下
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
晋财小藏馆
2012-11-22 · 贡献了超过138个回答
知道答主
回答量:138
采纳率:0%
帮助的人:19.3万
展开全部
不可以同一张表不能关联子级的外键
追问
如果不可以,请问有没有更好的解决方案呢?请予以指教!非常感谢!
追答
你可以建俩张表 字段可以一样 加个状态值表示俩张表不同就可以了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式