永发信息网

一个表可以有几个外键

答案:2  悬赏:60  手机版
解决时间 2021-12-20 05:26
一个表可以有几个外键
最佳答案
问题一:一个表如何建立多个外键加多个约束 student name是唯一吗?
name建议查询的时候查出来 用student的id比较好问题二:一张中间表最多有几个外键字段,能否用一张中间表关联多张表 1,数据表与数据表之间有关联(Relationship)是肯定的,但是不一定要用外键(Foreign Key),为什么?外键本质是一种约束(Constraint),该约束决定了你在增删改查的时候都会有额外开销。【实际上数据库在处理外键的时候估计也是创建一个中间表根据中间表来做关联操作,完成后再删除】
2,“对于 “N对N” 的关系,两个 Model 之间肯定是需要一张中间表的,比如 Student、Class 之间选课关系,是多对多的,肯定需要一张 Enroll 的表来维持,记录两个表的主键(Primary Key),但是不需要在数据库层加外键约束,只需要加两个索引,或作为联合主键。
3,至于查询,尽量不用 JOIN。但是问题是我确确实实是需要知道多个表的信息。
比如我要知道某门课(Class,已知 ID)的信息,同时还有选上该课(Enrolled)的学生信息(Student)。
使用 JOIN ?没问题,我相信你可以写出一个很长的 JOIN 语句。
但是,可能有的地方大概这样实现的(伪代码):
getClassInfo(@class_id)
{ SELECt class_col1, class_col2 FROM class WHERe class.id = @class_id }
getStudentInfo(@class_id)
{ SELECt student_col1, student_col2 FROM student WHERe student.id IN (SELECt enroll.student_id FROM enroll WHERe enroll.class_id = @class_id) }
两种方案各有优缺。
后者最大的一个优点是灵活,比如我们引入缓存(Caching)。
一般来说,一个学校 class 数量不多,并且经常被查询,系统可能会引入缓存层(如 memcached、redis)来存放 class 对象。
那么上面的 getClassInfo 其实会变为
{
if(memcached.has(@class_id) != null)
{
return memcached.get(@class_id);
}//查询数据库(只有 class 表),和上面的 SQL 一样
memcached.set(@class_id, class_object);
return class_object;
}问题三:mysql 一个表里可以有几个外键 1)主键是什么,主键在数据表中是唯一的标示,主键在一个表中是不允许重复的; 2)外键是什么,外键是主键表的一个对应关系表的连接标示; 在建立外键前你要确定,外键表是否已经建立; 从你的sql语句中可以看出你的错误:不说你关联表是不是存...问题四:一个表有两个外键好不好 这个没有“好不好”的说法,只是说有没有必要。
先说个例子吧:
一个表table包括:编号户姓名,性别,血型,星座,属相。
可是血型有四种,星座有十二个,属相也十二个,这些是固定不变的。
如果这些都直接写入数据库的话就会显的冗余。
这个可以跟常见的那个学生信息表与成绩表相对应着看,我们没有直接把成绩写入信息表中,而是用了外键。
所以我们可以把血型设置为一个表:血型表,星座设置为一个表:星座表,属相设置为一个表:属相表。然后在表table中引用外键。这个表引用了三个外键。
这个例子可能不是很好,可是就是这个道理:
为了设计的需要,一个表有几个外键是没有关系的,也不能说越多越好,这主要看我们的实际需要,而且还要使数据“完整”。
啰嗦了这么多希望你能明白。问题五:mysql 一张表可以有几个外键 假设一个场景机房配置电脑,总共有三张表,学生基础信息为a,学生密码表为b,a与b就是1对1的关系,同时还有一张表为计算机表c,假设一个学生只能有一台电脑,那a与c也是1对1的关系.只要你在设置表的时候正确设置主表和子表的关系,删除时先删子表再删主表就不会出现楼主不能删除的问题了问题六:oracle 一个表可以有2个外键约束吗 当然,一个表可以用两个foreign key的。
例如:
交易表里面可以有用户的外键,还可以有物品的外键。问题七:数据库表中可以在一个表里面有两个关联同一个表的外键吗 你要订单表中两个字段引用地址表中的一个字段,那你就在订单表中创建两个外键就行了:
ALTER TABLE order ADD CONSTRAINT address1 FOREIGN KEY (address_id) REFERENCES address;
ALTER TABLE order ADD CONSTRAINT address2 FOREIGN KEY (address_id) REFERENCES address;
你要删除的话:
delete from order where address1 = '1001' or address2 = '1001';
像这些数据,不建议做物理删除,也就是delete。你可以加一个状态字段,将它标识为无效就可以了。因为这些数据,对业务进行一些统计和数据分析都是有用的。再比如,我使用地址1下过一些订单,现在我搬家了,地址1就没用了,我要换另外一个地址。那我会删除地址1,再添加一个地址2,但我地址1的订单还是要看的吧,你总不能删除啊。而且在地址1的订单中,我要能看到地址1的地址信息。所以,这里对于地址删除,那就不能做delete了,只能做标识。标识无效后,只能代表地址在下单选择地址或一些其它操作的时候,这个无效的地址不显示,但在查看订单的时候,这个地址信息还是能显示出来的。
这个具体哪可以显示,哪不能显示,就要根据你的业务和实际情况来定了问题八:一张表允许有多个主键,但只能有一个外键 这个设定是可以通过的, 某些特定的情况下, 也是合理的。 特别是某些, 针对 其他系统的二次开发的情况下。 你需要为某个现有的模块, 增加一个扩展的功能,但是又不能修改别人的表。 -- 旧系统的表 CREATE TABLE old_table ( id INT NOT NULL, value VARCHAr(10), PRIMARY KEY(id) ); -- 要新增加扩展功能, 而又不修改旧系统的表的情况下 -- 是通过追加一个 One To One 关系的表 CREATE TABLE old_exp ( id INT NOT NULL, exp_data VARCHAr(10), PRIMARY KEY(id) ); -- 创建外键关联 ALTER TABLE old_exp ADD CONSTRAINT main_id_cons FOREIGN KEY (id) REFERENCES old_table(id);问题九:一个主键可以有多个外键吗? 本表的主键可以是多个表的外键!!
全部回答
谢谢解答
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
重庆市万盛区综合应急救援支队地址在什么地方
申通快递的单号不记得了 怎么查询货物
吃了中文版的纽康特换成英文版的有问题吗
阅读理解AboutsixyearsagoIwaseatinglunch
蚕怎么分公母图片
消防蓝图是什么
为什么我一拿钢笔写字却好看,拿了水笔写了字
0元撸东西,哪里有,求告
租房子开店需要办哪些手续
安全出口用英语怎么说
疯狂猜成语钟一面旗上写了三个腾是什么意思 
亥时出生的五行属什么
揭秘为什么梵克雅宝四叶草那么贵
Check you package carefully to make sure y
菊花泡茶可以吃里面的菊花吗
推荐资讯
在哪里可以找到2015秋季英语高级教师资格证考
长颈鹿油漆怎样辨认它的真伪。求解
单选题下列瓷器出现的先后顺序是()①青瓷②
I was fortunate enough to travel to South
天龙八部里天龙门派属性到底加体力还是灵气还
鲁迅《雪》的写作背景是什么
劲舞团怎么回复家族
5岁的儿童能喝矿泉水吗?
大北公司村委会位置在什么地方啊,我要过去办
“what’s the matter, mum?” As soon as I
特战英雄怎么得兑换码
信道增益怎么计算
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?