【问题标题】:There are no primary or candidate keys in the referenced table in sql server 2008sql server 2008 中引用的表中没有主键或候选键
【发布时间】:2016-09-14 15:25:02
【问题描述】:

类代码表

CREATE TABLE [dbo].[ClassCode](
[SchoolCode] [nvarchar](10) NOT NULL,
[ClassCode] [nvarchar](4) NOT NULL,
[ClassName] [nvarchar](50) NOT NULL,
[ClassRange] [int] NOT NULL,
[ClassDuration] numeric(38,2) NOT NULL,
[UserID] [nvarchar](30) NULL,
[RecordDate] [smalldatetime] NULL,  
 CONSTRAINT [PK_ClassCode] PRIMARY KEY CLUSTERED 
(
    [SchoolCode] ASC,
    [ClassCode] ASC,
    [ClassRange]
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

考试申报表

CREATE TABLE [dbo].[ExamDeclaration](
[SchoolCode] [nvarchar](10) NOT NULL,
[ClassCode] [nvarchar](4) NOT NULL,
[ExamCode] [nvarchar](4) NOT NULL,
[RegistationFess] numeric(38,2) NOT NULL,
[RegistatinStartDate] [date] NOT NULL,
[RegistatinEndDate] [date] NOT NULL,
[ExamStartDate] [date] NOT NULL,
[UserID] [nvarchar](30) NULL,
[RecordDate] [smalldatetime] NULL
 CONSTRAINT [PK_ExamDeclaration] PRIMARY KEY CLUSTERED 
(
    [SchoolCode] ASC,
    [ClassCode] ASC,
    [ExamCode] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]


GO

ALTER TABLE [dbo].[ExamDeclaration]  WITH CHECK ADD  CONSTRAINT [FK_ExamDeclaration_ClassCode] FOREIGN KEY([ClassCode])
REFERENCES [dbo].[ClassCode] ([ClassCode])
GO

ALTER TABLE [dbo].[ExamDeclaration] CHECK CONSTRAINT [FK_ExamDeclaration_ClassCode]
GO

我正在尝试设置外键 ClassCode

但收到此错误

Msg 1776, Level 16, State 0, Line 2 没有主要或候选 引用表“dbo.ClassCode”中与 外键中的引用列列表 'FK_ExamDeclaration_ClassCode'。消息 1750,第 16 级,状态 0,第 2 行 无法创建约束。请参阅以前的错误。消息 4917,第 16 级, 状态 0,第 2 行约束“FK_ExamDeclaration_ClassCode”不 存在。消息 4916,级别 16,状态 0,行 2 无法启用或禁用 约束。查看以前的错误。

这两张表有什么问题?

谢谢你..

【问题讨论】:

  • 您不能只用外键引用复合键的一部分。 ClassCode 中的主键是 3 列,但您试图仅将 ClassCode 引用为 ExamDeclaration 中的外键。
  • 您必须有 claacode 作为 pk 或引用表 classcode 中的唯一索引。你没有这样的pk。

标签: sql-server


【解决方案1】:

您的外键必须与主键完全匹配! 如果你这样声明主键 PK(X int,Y int, Z int),那么 FK 必须这样声明:FK (a int, b int, c int)引用 MyTable(X,Y,Z)

在您的情况下,您的 Pk 是(SchoolCode、ClassCode、ClassRange)。这意味着您应该像这样声明 FK:

ALTER TABLE [dbo].[ExamDeclaration] WITH CHECK ADD CONSTRAINT [FK_ExamDeclaration_ClassCode] FOREIGN KEY(SchoolCode, ClassCode, ClassRange) REFERENCES [dbo].[ClassCode] (SchoolCode, ClassCode, ClassRange) GO

修改您的表 ExamDeclaration,添加列 'ClassRange'。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 2018-12-25
    • 2022-01-07
    • 1970-01-01
    相关资源
    最近更新 更多