怎么能一个多主键的一列被用作外键
我有一个映射表,例如:怎么能一个多主键的一列被用作外键
english.Phrases (PhraseId int, WordId int, Order int)
Primary Key Clustered (PhraseId, WordId)
而另一个表:
english.RelatedPhrases (RelatedPhraseId int, PhraseId int)
如何设置外国使用PhraseId
的2个表之间的关键关系?
编辑回答评论哪个数据库: 我使用的是Microsoft SQL 2008,因此我更改了标记。
映射应该如下;考虑下面的语句:
1. "turn out to be", phraseId of 1
2. "grow to be", phraseId of 2
3. "turn into", phraseId of 3
4. "come to be", phraseId of 4
每个字有以下表中的条目:
english.Words (WordId int, Word varchar(20))
的english.Phrases表中是否有“变成是”下面的条目:
(1, @word1Id, 1) @word1Id = id of 'turn'
(1, @word2Id, 2) @word2Id = id of 'out'
(1, @word3Id, 3) @word3Id = id of 'to'
(1, @word4Id, 4) @word4Id = id of 'be'
现在,我想要从english.RelatedPhrases表中得到PhraseId为1,代表“结果是”,与其他短语相关,比如在这种情况下,2,3和4;所有相关关键词中的4个条目的RelatedPhraseId = 1。
如果Phrase
表可以有多个具有相同PhraseID的行,则应引入一个新表。例如:
create table PhraseIds (
PhraseId int primary key)
create table Phrase (
PhraseId int foreign key references PhraseIds,
WordId int,
[Order] int,
primary key (PhraseID, WordId))
create table RelatedPhrases (
RelatedPhraseId int primary key,
PhraseId int foreign key references PhraseIds(PhraseID))
虽然这并没有回答这个问题,但我决定采用这种方法,主要是因为它允许我保存每个短语的摘要数据,例如NumberOfWords&NumberOfCharacters,从而为我节省了通过连接进行聚合的成本。 –
外键只能引用唯一的一组列。这个条件与主键中的列数没有关系。 – Andomar
您可以检查是否在触发存在记录.. 只是不要忘了性能。
通常情况下,您不能将外键设置为(完整)主键以外的任何其他键。你使用的是哪个数据库? –
那究竟是什么映射?无论wordid与所有PhraseB有关吗?重新思考你的模式 –
@JoachimIsaksson IIRC根据数据库你也可以指向一个完整的唯一索引 – Luis