当前位置: 首页 > 面试题库 >

外键减速删除

柴兴贤
2023-03-14
问题内容

我有一个表X,该表具有一个自动递增的ID列作为其主键。我还有其他表A,B,C和D,它们补充了表X中的信息。每个表都必须包含一个引用表X中ID的列。我已经这样做了,并且在我的代码(Java)中,将每个条目的ID返回到表X并在插入其他表时使用该ID的方法。一切都很好。

现在,建议我将表A,B,C和D上的ID列分配为FOREIGN KEYS,因为“这是正确的做法”。我做到了 现在,从表X中删除行需要花费大量时间
。插入其他表也需要更长的时间。

请不要误会我的意思,我知道为什么外键与指定数据库上表的关系相关。但这似乎只是仪式性的,而不是实际相关的,尤其是当我的交易变得越来越慢时。

问题:

1.即使没有必要,为了保持正式的关系而丧失一些表现是否值得?

2.有什么方法可以加快我的交易速度并仍然保持FOREIGN KEY规范。

谢谢。

补给品

这是创建表的方式。

创建表SQL:

CREATE TABLE [dbo].[MainTableX](
    [col1] [smalldatetime] ,
    [col2] [varchar] (20) ,
    [ID] [int] IDENTITY(1,1) NOT NULL,
 CONSTRAINT [PK_MainTableX] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)
)
GO


CREATE TABLE [dbo].[RelatedTableA](
    [differentID] [varchar] (50),
    [detail1] [varchar] (40),
    [detail2] [varchar] (40),
 CONSTRAINT [PK_RelatedTableA] PRIMARY KEY CLUSTERED 
(
    [differentID] ASC
)
GO

-- Tables B, C D are pretty much similar to table A

添加外键SQL:

ALTER TABLE RelatedTableA ADD ID INT 
CONSTRAINT fk_refTableX_A FOREIGN KEY (ID)
REFERENCES MainTableX(ID) 
GO
-- Same thing with the other related tables

解决方案

我将外键列作为索引。现在,我的查询又很快了。

Create nonclustered index IX_RelatedTableA 
on RelatedTableA (ID) 
GO

问题答案:

如果FOREIGN KEY列已正确索引( 我相信应该随声明自动发生 ),那么在最坏的情况下,您应该会看到性能下降。请列出每个表的CREATE
TABLE SQL,因为听起来那里有些问题。

SQL Server不会在FK列上自动创建索引,因此请确保您自己执行此操作。

使用外键关系的目的不是为了“正式宣布”任何(或不 只是 要做到这一点,在任何情况下)。而是,它为数据库引擎提供了足够的信息来 增强
数据的完整性。这意味着您不会错误地使您的应用程序添加或删除记录,从而违反了关系。此外,使用该数据库的其他应用程序(例如Management
Studio)也不能这样做。出于这个原因-确保数据库引擎强制执行规则-声明约束很重要。



 类似资料:
  • 我有一个简单的地图减少工作,我正在建立反向索引。 我的映射器工作正常(我检查过了),并输出了word和docID:TFIDF值的密钥对: 映射器(仅显示输出): 化简器的唯一工作是组合这些值。这是我的实现: 然而,它没有组合任何东西,输出看起来基本上与来自映射器的相同。输出中有一些行具有相同的键,尽管reducer应该将它们组合起来——基本上,使用reducer时,输出文件中的所有键都应该是唯一的

  • (警告:我不是MySQL专业人士,我使用工作台代替知道命令,所以我的问题可能很简单) 我试图重命名表(user)中的主键(userID),但MySQL不允许(错误号150)。经过一番挖掘,我似乎必须先删除外键,然后才能重命名主键。 因此,在Workbench中,我转到下一个表(问题)并选择alter table,然后转到外键选项卡。我在左侧窗口中选择唯一的外键(fk\u question\u us

  • 我写了映射和Reduce程序,其中reducer的输出键和值不同于它的输入或映射器的输出。我在司机班上做了适当的改变。下面是我在运行它时得到的异常: 信息MapReduce.job:任务Id:Attribut_1550670375771_4211_M_0000032,状态:失败错误:java.io.ioException:map中的值类型不匹配:expected org.apache.hadoop

  • 问题内容: 我有一个表,该表的主键在其他几个表中使用,并且对其他表有几个外键。 问题是,当我尝试删除外键列之一(即locationIDX)时,它给了我一个错误。 “错误1025(HY000):重命名错误” 如何在没有出现此错误的情况下将列删除到上面的分配表中? 问题答案: 正如解释在这里,似乎外键约束必须由被丢弃 的约束名称 ,而不是索引名。语法为:

  • 问题内容: 我有两个像这样的表: 因此,逻辑很简单,用户删除了类别x下​​的所有书籍,从猫中删除了x之后,我尝试了上述方法,但不起作用,在我清理了表格书籍后,表格类别仍被填充,这是怎么回事? 问题答案: 具有级联删除功能的外键意味着,如果删除父表中的记录,则子表中的相应记录将被自动删除。这称为级联删除。 您说的是相反的意思,这不是当您从子表中删除时会将记录从父表中删除。 ON DELETE CAS

  • 有这两个类: ddress.java: User.java: 演示应用程序。爪哇: 运行时,如果失败,出现此错误: GenerationTarget遇到异常接受命令:通过JDBC语句执行DDL“更改表user_addresses删除外键FKfm6x520mag23hvgr1oshaut8b”时出错 然而,最终的表格被创建:: : 为什么jdbc不能删除表中的外键?如何让jdbc做到这一点?