【问题标题】:Finding columns that do not match existing primary key查找与现有主键不匹配的列
【发布时间】:2009-07-24 15:22:07
【问题描述】:

我正在尝试向表中添加外键,但数据库 Sql Server 2005 不喜欢它。

它表示列与现有的主键或唯一约束不匹配。

如何找到有问题的列,以便删除/更改它们并添加外键?

【问题讨论】:

    标签: sql sql-server visual-studio-2008 sql-server-2005


    【解决方案1】:

    对相关键的父表进行左连接,然后检查子表中左连接的父表中的值为空的值。

    例如,如果这是您的架构...

    table1:
        myKey int primary key,
        ...other columns...
    
    table2:
        otherKey int primary key,
        myKeyFromTable1 int
        ...other columns...
    

    你会这样做:

    select distinct
        t2.myKeyFromTable1
    
    from table2 t2
    
    left join table1 t1 on t1.myKey = t2.myKeyFromTable1
    
    where t1.myKey is null
    

    这将为您提供 table2 中的不同值,而 table1 中没有相应的父项。

    【讨论】:

      【解决方案2】:
      SELECT 
         ForeignKey 
      FROM 
         FK_TABLE f 
      LEFT JOIN 
         PK_TABLE p ON f.ForeignKey = p.PrimaryKey 
      WHERE 
         p.PrimaryKey = NULL
      

      应该可以的。

      ForeignKey = 你想成为外键的列
      PK_TABLE = 您希望外键引用的表
      PrimaryKey = 列 ForeignKey 将成为外键。

      【讨论】:

        【解决方案3】:
        SELECT *
          FROM FK_Table
         WHERE ForeignKey NOT IN (SELECT PrimaryKey FROM PK_Table);
        

        这与为单列键编写的一样工作。如果您的 DBMS 允许该符号,它也可以用于多列键:

        SELECT *
          FROM FK_Table
         WHERE (FK_Col1, FK_Col2) NOT IN (SELECT PK_Col1, PK_Col2 FROM PK_Table);
        

        不过,并非每个 DBMS 都支持这一点。这种不存在的公式应该适用于大多数地方:

        SELECT *
          FROM FK_Table
         WHERE NOT EXISTS (SELECT 1
                             FROM PK_Table
                             WHERE FK_Col1 = PK_Col1 AND FK_Col2 = PK_Col2
                          );
        

        【讨论】:

          【解决方案4】:

          所以你有一个带有 X 列的 TableA 和一个带有 Y 列的 TableB。并且你想让 Y 成为一个外键,这样 TableB.Y 的所有值都是 TableA.X 中的值,对吗?

          为此,TableA.X 需要具有主键或唯一约束。听起来情况并非如此。首先使 TableA.X 独一无二,然后从 TableB.Y 中定义您的 FK,并引用 TableA.X

          【讨论】:

          • 我认为创建 FK 的语句正在通过“PK 表上是否存在 PK 或唯一约束”测试。问题是通过验证 FK 表中的每一行是否与 PK 表中的某个值匹配的部分方法是发现 FK 列中的某些值与 PK 表中的任何行都不匹配 - 因此无法创建密钥。
          猜你喜欢
          • 1970-01-01
          • 2022-12-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多