永发信息网

一个表可以有几个外键

答案:2  悬赏:60  手机版
解决时间 2021-12-20 05:26
  • 提问者网友:火车头
  • 2021-12-20 01:58
一个表可以有几个外键
最佳答案
  • 五星知识达人网友:西风乍起
  • 2021-12-20 02:28
问题一:一个表如何建立多个外键加多个约束 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);问题九:一个主键可以有多个外键吗? 本表的主键可以是多个表的外键!!
全部回答
  • 1楼网友:你哪知我潦倒为你
  • 2021-12-20 03:33
谢谢解答
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯