2012-04-05 111 views
0

我在创建数据库中的外键时遇到了一些麻烦。以下是对我的表看起来像一个转述模型:创建新外键(SQL Server)

注意

* (PK) NOTE_ID BIGINT 
*  TITLE  VARCHAR(200) 
*  DATE  DATETIME 
*  SERIES_ID BIGINT 

系列

* (PK) SERIES_ID BIGINT 
*  TITLE  VARCHAR(200) 
*  DESCR  VARCHAR(1000) 

我想创建一个“具有” NOTE之间的关系, SERIESSERIES_ID。我认为,通过SERIES_ID建立两个表之间的外键将是解决办法,但是当我尝试创建它,我得到以下错误:

ERROR: There are no primary or candidate keys in the referenced table 'dbo.SERIES' that match the referencing column list in the foreign key 'FK_SERIES_NOTE'. Could not create constraint

我用自带的网络数据库管理器我设置的GoDaddy SQL Server,所以我不确定它试图使用的底层查询或我将它发布。

在一天结束时,这是所有创建一个关系,以便我的Note对象的NHibernate映射将包含与Series对象的一对一关系。不过,我甚至可能没有试图用外键来解决这个问题。

我正在以正确的方式去解决这个问题吗?

编辑: 在试图将表格配对到一个更简单的例子,我删除了我认为是几个非关键列。但是,我最终留下了一个实际上是系列表上复合主键的一部分的字段。所以,因为我试图将外键只分配给组合键的一部分,所以不允许我这样做。

最后,我再次审视了我的表的结构,发现我实际上并不需要组合键的另一部分 - 并且在删除之后,现在外键的分配很好。

+0

没有**正在生成实际的T-SQL语句**,这真的很难说出任何东西....最有可能的是,网站管理员做错了什么 - 或者你选错了专栏或什么..... – 2012-04-05 11:16:06

+1

@Tyler,从NHibernate的角度和数据库的角度来看,这不是一对一的关系。这是多对一的关系。如果两个主键都是'NOTE_ID',那么这将是一对一的关系。 – 2012-04-05 11:43:54

+3

您已将'SERIES_ID'标记为'SERIES'中的主键,但是您是否检查过这是实际的?很多人混淆了主键和标识列 - 它们是两个单独的概念。如果可能,您使用的管理器应用程序是否可以为现有对象生成脚本?如果是这样,添加实际的表格定义而不是伪定义将是有用的。 – 2012-04-05 12:56:54

回答

0

如果可以的话,你可能会尝试在查询分析器运行下面的语句,看看所产生的错误信息(我猜@Damien_The_Unbeliever是正确的):

ALTER TABLE NOTE ADD CONSTRAINT FK_SERIES_NOTE 
FOREIGN KEY (SERIES_ID) REFERENCES SERIES(SERIES_ID) 
--ON DELETE CASCADE 
-- uncomment the preceding line if you want a delete on a serie 
-- to automatically delete all notes on this serie 

希望这将有助于