首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >层叠问题

层叠问题
EN

Stack Overflow用户
提问于 2011-06-29 02:55:26
回答 2查看 124关注 0票数 0

我有这个:

代码语言:javascript
运行
复制
Foo
Id|BarId

Bar
Id

TableX
Id|FooId|BarId

TableY
Id|FooId|BarId

我需要它用于这样的情况:如果像这样的查询

代码语言:javascript
运行
复制
update Foo
set BarId = some bar id
where BarId = some other bar id

然后它级联到TableXTableY。是否可以将FK与on update cascade一起使用,或者仅使用手动定义的触发器?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-01 03:28:38

首先,删除TableXTableY中的所有外键约束。

然后:

代码语言:javascript
运行
复制
ALTER TABLE TableX
   ADD CONSTRAINT FK_TableX_FooId_BarID FOREIGN KEY (FooId, BarId)
   REFERENCES Foo (Id, BarId) ON UPDATE CASCADE;

-- Do the same for TableY

您没有说您使用的是什么数据库管理系统(请这样做),但这肯定会在SQL Server中运行,可能还会在MySql中运行。在此外键引用生效之前,必须对表Foo中的(Id, BarId)具有索引或唯一约束(隐式创建索引)。

您不希望对每一列使用单独的外键,因为这将打破BarIdFooId之间的分层多层关系。如果您更新Foo中的特定BarId,您希望它只更新TableX中与该特定FooId链接的那些BarId,而不是整个表中的所有FooId。(也就是说,如果我理解正确的话)。

我也情不自禁地提出,应该删除名为Id的列,然后朝它的头部开枪。不久之后,他们的创造者至少受到了一次坚实的鞭打。:)改为将Foo表的主键命名为FooId。随着数据库的增长和涉及越来越多表的查询变得越来越复杂,不断给列添加别名(F.Id FooId)不仅令人讨厌,而且越来越有可能会出错,比如说,不小心将T.Id放在您想要的位置P.Id,查询将不会给您任何错误,因为这两个表中都有该列。

在我的理解中,数据库专业人员的普遍共识是,无论在哪里使用列,都应该使用相同的名称,包括在它们的源表中。

另外,如果没有在其他地方引用TableX和TableY,那么这些列中的人工Id列可能会倾向于另一个具有业务意义的列。我对表的了解不多,但很多时候,在不需要它们的时候会生成额外的人工in (例如在多对多中间连接表中,它们几乎永远不应该有单独的in)。

票数 0
EN

Stack Overflow用户

发布于 2011-06-29 04:09:28

如果指定On Update Cascade,则将更新引用的值。尝试使用该创建脚本

代码语言:javascript
运行
复制
CREATE TABLE TableX(
  id INT, 
  FooId INT,
  BarId INT,
  INDEX foo_idx (FooId),
  INDEX bar_idx (BarId),
  FOREIGN KEY (FooId) 
    REFERENCES Foo(Id) 
    ON UPDATE CASCADE
  FOREIGN KEY (BarId) 
    REFERENCES Bar(Id) 
    ON UPDATE CASCADE
) ENGINE=INNODB;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6511668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档