表 A 的 PK 被表 B 的 FK 引用。不能掉表A的PK

Posted

技术标签:

【中文标题】表 A 的 PK 被表 B 的 FK 引用。不能掉表A的PK【英文标题】:Table A's PK is being referenced by Table B's FK. Cannot drop Table A's PK 【发布时间】:2014-12-09 18:33:43 【问题描述】:

MS SQL 服务器

我正在制作星型模式。我已经为我的表设置了PK'sFK,现在我正在尝试编写一个过程来删除约束、截断表、再次添加约束,然后重新填充表。当我尝试删除约束时,我收到错误:

“约束 PK_TIMEDIM 被表 SalesFactTable 引用,外键约束 FK_SALESFACTTABLE。无法删除约束。”

编辑:解决了一个问题。另一个发现。我收到了同样的错误,除了现在有神秘的自动生成的FK's,例如FK__SalesFact__CUST___19DFD96B

请告诉我我做错了什么。

ALTER PROCEDURE [dbo].[A11]
AS
BEGIN

--Drop constraints
ALTER TABLE SalesFactTable
DROP CONSTRAINT FK_SALESFACTTABLE

ALTER TABLE SalesFactTable
DROP CONSTRAINT PK_SALESFACTTABLE

ALTER TABLE TimeDim
DROP CONSTRAINT PK_TIMEDIM

ALTER TABLE CustomerDim
DROP CONSTRAINT PK_CUSTOMERDIM

ALTER TABLE PartDim
DROP CONSTRAINT PK_PARTDIM

--Truncate tables
TRUNCATE TABLE TimeDim
TRUNCATE TABLE CustomerDim
TRUNCATE TABLE PartDim
TRUNCATE TABLE SalesFactTable

--Add constraints
ALTER TABLE TimeDim
ADD CONSTRAINT PK_TIMEDIM PRIMARY KEY (TIME_ID)

ALTER TABLE CustomerDim
ADD CONSTRAINT PK_CUSTOMERDIM PRIMARY KEY (CUST_ID)

ALTER TABLE PartDim
ADD CONSTRAINT PK_PARTDIM PRIMARY KEY (PART_ID)

ALTER TABLE SalesFactTable
ADD CONSTRAINT FK_SALESFACTTABLE FOREIGN KEY (TIME_ID) REFERENCES TimeDim (TIME_ID),
FOREIGN KEY (CUST_ID) REFERENCES CustomerDim (CUST_ID),
FOREIGN KEY (PART_ID) REFERENCES PartDim (PART_ID)

ALTER TABLE SalesFactTable
ADD CONSTRAINT PK_SALESFACTTABLE PRIMARY KEY (TIME_ID, CUST_ID, PART_ID)

【问题讨论】:

嗯,PK 很可能是一个主键,并且存在引用它的外键约束。您需要更改顺序以便首先删除外键约束? 那行得通。谢谢!我会尽量记住顺序在未来很重要。 【参考方案1】:

**外键是由主键引用的,所以在移除外键约束之前不允许移除主键。 因此,您需要先删除外键才能从表中删除主键约束。

**

ALTER PROCEDURE [dbo].[A11]
AS
BEGIN
  --Drop FK constraints
ALTER TABLE SalesFactTable
DROP CONSTRAINT FK_SALESFACTTABLE
    --Drop PK constraints
ALTER TABLE SalesFactTable
DROP CONSTRAINT PK_SALESFACTTABLE

ALTER TABLE TimeDim
DROP CONSTRAINT PK_TIMEDIM

ALTER TABLE CustomerDim
DROP CONSTRAINT PK_CUSTOMERDIM

ALTER TABLE PartDim
DROP CONSTRAINT PK_PARTDIM

--Truncate tables
TRUNCATE TABLE TimeDim
TRUNCATE TABLE CustomerDim
TRUNCATE TABLE PartDim
TRUNCATE TABLE SalesFactTable

--Add constraints
ALTER TABLE TimeDim
ADD CONSTRAINT PK_TIMEDIM PRIMARY KEY (TIME_ID)

ALTER TABLE CustomerDim
ADD CONSTRAINT PK_CUSTOMERDIM PRIMARY KEY (CUST_ID)

ALTER TABLE PartDim
ADD CONSTRAINT PK_PARTDIM PRIMARY KEY (PART_ID)

ALTER TABLE SalesFactTable
ADD CONSTRAINT FK_SALESFACTTABLE FOREIGN KEY (TIME_ID) REFERENCES TimeDim (TIME_ID),
FOREIGN KEY (CUST_ID) REFERENCES CustomerDim (CUST_ID),
FOREIGN KEY (PART_ID) REFERENCES PartDim (PART_ID)

ALTER TABLE SalesFactTable
ADD CONSTRAINT PK_SALESFACTTABLE PRIMARY KEY (TIME_ID, CUST_ID, PART_ID)    

【讨论】:

感谢您的回答!我能够成功删除我创建的约束,但现在我收到了同样的错误,除了神秘的自动生成(?)FK's,例如FK__SalesFact__CUST___19DFD96B 可以调试存储过程吗???看看你在 sp 的哪个部分得到这个错误?? 调试器无法启动,因为我被拒绝执行权限。 :( 这很奇怪。删除PK_TIMEDIM 时不会出现新错误,但尝试删除PK_CUSTOMERDIMPK_PARTDIM 时会出现新错误。我不知道为什么它似乎以不同的方式对待他们。 好的。 SalesFactTable 以某种方式与 CustomerDim 和 PartDim 表相关两次。这可能是问题的一部分......

以上是关于表 A 的 PK 被表 B 的 FK 引用。不能掉表A的PK的主要内容,如果未能解决你的问题,请参考以下文章

phpmyadmin 此表不包含唯一列[重复]

复合 FK 引用原子 PK + 非唯一属性

查询联结表中FK引用的表中的其他字段

PK和FK表设计之间的混淆

多对多关联表PK作为其他表中的FK

如何在 SQL Server 中复制表(包括 PK 和 FK)