sql - 表 A 的 PK 被表 B 的 FK 引用。不能丢弃表 A 的 PK

标签 sql sql-server star-schema

微软 SQL 服务器

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

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

编辑:一个问题解决了。另一个发现。我收到同样的错误,除了现在有神秘的自动生成 FK'sFK__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)

最佳答案

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

**

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)    

关于sql - 表 A 的 PK 被表 B 的 FK 引用。不能丢弃表 A 的 PK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27386263/

相关文章:

sql - PostgreSQL:如何在函数中并行运行查询?

MySQL - GROUP_CONCAT 返回重复数据,不能使用 DISTINCT

c# - Visual C# SQL 语句不会插入到数据库中

sql - 事实表中重复的维度属性限制了报告中的过滤/显示

sql-server - 星型模式命名约定

sqlalchemy - SQLAlchemy中的星型架构

sql - 在 SQL Server 中从 JSON 中的数组获取值

mysql - Sean Lahman 数据库示例查询

c# - NHibernate - 如何解决 SQL Server 中的参数计数限制

sql - sql语法有什么问题