如何定义两列之间的关系,其中一列是主键?
How to define relationship between two columns of which one is primary key?
对于一个项目,我正在创建一个数据库模型,但我不确定我是否走在正确的道路上。我试图找到答案,但一无所获。
我有两个 table。其中一个是另一个的'subclass'。
示例:Animal
和 Horse
。 Horse
有一个名为 HorseId
的主键,Animal
有一个名为 AnimalId
的主键。 HorseId
是引用 AnimalId
的外键。到目前为止,一切都很好。
现在我想在 Animal
table 中添加一列 Type
,这样我就知道它是什么动物了。 Animal
现在有 AnimalId
和 Type
作为列。
Table动物
AnimalId (PK)
Type
Table马
HorseId (PK, FK ref Animal.AnimalId)
但是,标识马的 AnimalId
应该始终具有 'Horse' 作为 Type
。一种可能是使 Type
成为主键的一部分,但这似乎不正确,因为 AnimalId
唯一地标识了它的一行。
另一种选择是创建一个包含两列的备用键。但是,我的验证器告诉我 'primary key is a subset of alternate key'(这是正确的),并警告我。不允许吗?
我该如何解决?
提前致谢!
使用触发器解决了多个问题。
我不得不更改外键关系,因为它的定义方式错误。如果我希望能够在 Horse
中创建新记录,AnimalId
应该引用 HorseId
。
此外,备用钥匙不是必需的。主键和外键已经确保Animal
中的一条记录引用了Horse
中的一条记录,所以总会有一条Type
.
为了确保 Animal
中的 Type
是正确的,我已经能够创建一个触发器。在 Horse
中插入一条记录后,触发器会自动将一条记录插入 Animal
中,其中 Type
和 Id
是正确的。
Animal
的触发器和主键保证了没有人可以直接向Animal
输入一行而插入错误的Type
。
触发器如下:
CREATE trigger Trigger
ON Horse
AFTER INSERT
AS
DECLARE @Id uniqueidentifier
SET @Id = (SELECT HorseId FROM inserted)
INSERT Animal VALUES (@Id, 'Horse')
感谢您为我指明正确的方向!
对于一个项目,我正在创建一个数据库模型,但我不确定我是否走在正确的道路上。我试图找到答案,但一无所获。
我有两个 table。其中一个是另一个的'subclass'。
示例:Animal
和 Horse
。 Horse
有一个名为 HorseId
的主键,Animal
有一个名为 AnimalId
的主键。 HorseId
是引用 AnimalId
的外键。到目前为止,一切都很好。
现在我想在 Animal
table 中添加一列 Type
,这样我就知道它是什么动物了。 Animal
现在有 AnimalId
和 Type
作为列。
Table动物
AnimalId (PK)
Type
Table马
HorseId (PK, FK ref Animal.AnimalId)
但是,标识马的 AnimalId
应该始终具有 'Horse' 作为 Type
。一种可能是使 Type
成为主键的一部分,但这似乎不正确,因为 AnimalId
唯一地标识了它的一行。
另一种选择是创建一个包含两列的备用键。但是,我的验证器告诉我 'primary key is a subset of alternate key'(这是正确的),并警告我。不允许吗?
我该如何解决?
提前致谢!
使用触发器解决了多个问题。
我不得不更改外键关系,因为它的定义方式错误。如果我希望能够在 Horse
中创建新记录,AnimalId
应该引用 HorseId
。
此外,备用钥匙不是必需的。主键和外键已经确保Animal
中的一条记录引用了Horse
中的一条记录,所以总会有一条Type
.
为了确保 Animal
中的 Type
是正确的,我已经能够创建一个触发器。在 Horse
中插入一条记录后,触发器会自动将一条记录插入 Animal
中,其中 Type
和 Id
是正确的。
Animal
的触发器和主键保证了没有人可以直接向Animal
输入一行而插入错误的Type
。
触发器如下:
CREATE trigger Trigger
ON Horse
AFTER INSERT
AS
DECLARE @Id uniqueidentifier
SET @Id = (SELECT HorseId FROM inserted)
INSERT Animal VALUES (@Id, 'Horse')
感谢您为我指明正确的方向!