sql server在同一张表中同时存在主键和外键互相关联是否可以?
为了实现层级关系,设计表如下:地区表地区ID地区名称上一级地区ID001山东省002青岛市001地区ID作为地区表的主键,上一级地区ID是地区表的外键,并关联地区表的主键...
为了实现层级关系,设计表如下:
地区表
地区ID 地区名称 上一级地区ID
001 山东省
002 青岛市 001
地区ID作为地区表的主键,上一级地区ID是地区表的外键,并关联地区表的主键地区ID
请问这样做是否可以?如果可以,那么在插入第一行数据的时候就会出现无上一级地区ID数据,这样是否就破坏了完整性约束了呢?请高数予以指教,非常感谢! 展开
地区表
地区ID 地区名称 上一级地区ID
001 山东省
002 青岛市 001
地区ID作为地区表的主键,上一级地区ID是地区表的外键,并关联地区表的主键地区ID
请问这样做是否可以?如果可以,那么在插入第一行数据的时候就会出现无上一级地区ID数据,这样是否就破坏了完整性约束了呢?请高数予以指教,非常感谢! 展开
4个回答
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
例如:
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
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你可以分开成两个表,一个表只放省,一个表只放市,然后进行关联
追问
您的建议非常好,但是这样做的话,就会变的难以扩展,如果是地区还好说,笔毕竟层级数量是有限的,但是如果是其他类型的就麻烦了
比如:商品分类
一级类目
二级类目
三级类目
···
如果每一级类目做一张表,日后一旦需要增加一级类目,那就是需要再来一张表,那就完蛋了,程序还得改,所以这样做虽然解决了这个问题,却带来了更大的问题,有些得不偿失
不知道我理解的是否正确?
追答
额 对了 你这个可以实现的 就是那个父子的关系,你去看看数据库的递归就好了。不清楚的话 可以继续探讨下
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不可以同一张表不能关联子级的外键
追问
如果不可以,请问有没有更好的解决方案呢?请予以指教!非常感谢!
追答
你可以建俩张表 字段可以一样 加个状态值表示俩张表不同就可以了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询