我有一个表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做到这一点?