【发布时间】:2010-06-12 23:03:51
【问题描述】:
我有两张桌子:
create table [dbo].[Main]
(
[ID] [int] identity(1,1) primary key not null,
[No] [int] not null,
[Sign] [char](1) not null
)
create table [dbo].[Names]
(
[ID_Main][int] primary key not null,
[Name][nvarchar](128) not null,
constraint [FK_Main_Users] foreign key ([ID_Main]) references [dbo].[Main]([ID]),
constraint [CK_Name] unique ([Name], [Sign])
)
问题在于第二个约束 CK_Name
有没有办法从外部表中创建一个约束目标列?
编辑:
说明。
我在使用 EntityFramework 的 Silverlight 应用程序中使用这些表。
实体是由 Table 每个类型继承创建的,所以代码是这样的:
public abstract class Main
{
// main properties
}
public class Names : Main
{
// names properties
}
这迫使我不要使用 sql 视图。
样本数据。
如您所见,有些行名称相同但符号不同。 不能有任何具有相同标志的非唯一名称。
我想强制只有一个带有符号 = A 的名称和只有一个带有符号 C 的名称 但是很多名字带有Sign = B
【问题讨论】:
-
为什么不在
[Name, ID_Main]和[Sign]在[Main]表中的其他唯一? -
鉴于您提供的其他信息,我想进一步了解您为什么需要此限制。
Main和Names代表什么实体?给定示例输出,Names表看起来像一个中间表,但ID_Main是一个 PK,因此它实际上是作为 1:1 关系执行的。一个标志只能有一个名字而另一个标志可以有多个名字的规则是什么? -
几乎我系统中的每个表都有几个公共列,所以我将它们放在一个主表中,其他表引用它们。是的,这似乎是 1:1 的关系,但其他一些逻辑使它成为 1:* 但不是直接的
-
这是 SQL,而不是 OOP,其概念在基于 SET 的环境中没有实际意义。
-
正如 OMG Ponies 所说,关系模型与 OOP 不同。您不能创建一个基表来为所有其他表统治它们。暂时忘记属性(列),从系统中存在的主要实体开始。通常,每个实体都会有自己的表。
标签: sql sql-server tsql constraints unique