代码之家  ›  专栏  ›  技术社区  ›  Luk

外键引用SQL Server中的2列主键

  •  23
  • Luk  · 技术社区  · 14 年前

    这个问题和 this one ,但对于SQL Server 2005:

    --'#' denotes the primary key
    [Libraries]
    #ID   #Application  Name
     1     MyApp        Title 1
     2     MyApp        Title 2
    
    
    [Content]
    #ID   Application  LibraryID  Content
     10    MyApp       1          xxx
     11    MyApp       1          yyy
    

    (数据库显然要复杂得多,使用这个双键是有意义的)

    每个库都由其唯一的ID和应用程序名称标识。我试图确保每个内容都正确地引用了现有的库。

    创建约束(使用向导)时

    Primary key table            Foreign key table
    [Libraries]                  [Content]
    ID                  --->     LibraryID
    Application         --->     Application
    

    我有以下错误:

    “Libraries”表中的列 不匹配现有主键或 唯一约束

    非常感谢你的帮助!

    5 回复  |  直到 7 年前
        1
  •  62
  •   marc_s Anurag    14 年前

    当然,可以创建一个与复合主键(不止一列)的外键关系。你没有向我们展示你用来建立这种关系的陈述-应该是这样的:

    ALTER TABLE dbo.Content
       ADD CONSTRAINT FK_Content_Libraries
       FOREIGN KEY(LibraryID, Application)
       REFERENCES dbo.Libraries(ID, Application)
    

    你用的就是这个吗??如果 (ID, Application) 确实是上的主键 dbo.Libraries ,这句话肯定管用。

    SELECT
        tc.TABLE_NAME,
        tc.CONSTRAINT_NAME, 
        ccu.COLUMN_NAME
    FROM 
        INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
    INNER JOIN 
        INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu 
          ON ccu.TABLE_NAME = tc.TABLE_NAME AND ccu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME
    WHERE
        tc.TABLE_NAME IN ('Libraries', 'Content')
    
        2
  •  10
  •   Will Russell    10 年前

    请注意,字段的顺序必须相同。如果要引用的主键被指定为(Application,ID),那么外键必须引用(Application,ID)而不是(ID,Application),因为它们被视为两个不同的键。

        3
  •  5
  •   Dimitri Mestdagh    7 年前

    关键是“列的顺序应该相同”

    例子:

    create Table A (
        A_ID char(3) primary key,
        A_name char(10) primary key,
        A_desc desc char(50)
    )
    
    create Table B (
        B_ID char(3) primary key,
        B_A_ID char(3),
        B_A_Name char(10),
        constraint [Fk_B_01] foreign key (B_A_ID,B_A_Name) references A(A_ID,A_Name)
    )
    

    表A上的列顺序应为--> A_ID 然后 A_Name ; 定义外键也应该遵循相同的顺序。

        4
  •  1
  •   Adrian Godong    14 年前

    Content 表可能有多个重复项 Application Libraries . 有没有可能扔掉那辆车 应用 主键索引并将其添加为唯一键索引?

        5
  •  0
  •   Marko cyn    12 年前

    如果你的领域 Application Library 具有引用另一个表(名为 应用 我敢打赌),然后你的领域 应用 在表中 表必须有外键 我也是。

    请原谅我的英语不好,如果我错了,请原谅。