【问题标题】:Cannot create a relation between two tables with three primary keys无法在具有三个主键的两个表之间创建关系
【发布时间】:2018-05-07 00:08:24
【问题描述】:

我最近使用 Microsoft SQL Server Migration Assistant for Oracle 通过两遍方法将 Oracle 数据库转换为 SQL Server 数据库。

有两个表,BILL_INFO 和BILL_INFO_DETAIL,应该通过复合 PK 建立主从关系。但是,当我尝试创建该关系时,出现此错误:

'BILL_INFO' 表保存成功 'BILL_INFO_DETAIL' 表 - 无法创建关系“FK_BILL_INFO_DETAIL_BILL_INFO”。 ALTER TABLE 语句与 FOREIGN KEY 约束冲突 “FK_BILL_INFO_DETAIL_BILL_INFO”。数据库发生冲突 “我的数据库”,表“dbo.BILL_INFO”。

数据库受到不良数据的困扰。于是我在明细表中进行了基本搜索,找到了master中可能不存在的BILL_NUMBER、PAY_MODE_ID和CASHIER_ID(一一),在BILL_NUMBER上搜索时发现了两条记录。我修复了它们,还验证了 PAY_MODE_ID 和 CASHIER_ID 是否正常。

仍然无法创建关系。同样的错误。现在我想知道表之间的元组是否无效。如何找到只存在于明细表中的复合键?

【问题讨论】:

  • Select * from Bill_Info_Detail d left join Bill_Info on <your three columns> where Bill_Info.column is null
  • 除了您的问题之外,我想知道您是否将唯一键应用于 Bill_Info_Detail,而您实际上并不需要将键设为唯一。三个可能没有 LineNumber 或 TransactionID 会使其唯一。

标签: sql-server


【解决方案1】:

您可以使用以下方法检查不存在的值:

SELECT bill_number, pay_mode_id, cashier_id
FROM Bill_Info_Detail
EXCEPT
SELECT bill_number, pay_mode_id, cashier_id
FROM Bill_Info;
-- and then fix missing data

使用复合键时,需要将所有列检查为元组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多