【问题标题】:create foreign key in different data type创建不同数据类型的外键
【发布时间】:2018-09-19 10:55:05
【问题描述】:

我不知道这是否可能,我以这种方式进行了搜索,但很多人只是说这是不可能的。但是,我从互联网上获得了一份数据,用于以复制案例或应用程序的方式进行研究,当然看起来这很可能为不同的数据类型建立关系。我们来看一个例子。

【问题讨论】:

  • 您的表格设计不一致。修复那些列定义,问题就消失了。
  • 补充什么 jarlh 说的,你是对的,你不能混合关系中两列的数据类型,所以你需要使它们成为相同的数据类型才能工作.
  • 同意以上-最有效和正确的方法。以防万一您无法更改设计,则可以在两个字段之间建立一个链接表,每列具有适当的类型。您还可以创建一个视图来为您提供这些结果。您还可以编写一个视图来执行连接并使用它。效率不高或不推荐,但可能,即使对于不相关的类型也是如此。例如。 SELECT * FROM [dbo].[TableA] A 内连接 [dbo].[TableB] B on cast(B.[SomeStringField] as varchar) = cast(A.[SomeIntegerField] as varchar)
  • 如果订单的 ID 实际上是 11 或 12 个字符,会发生什么情况?它永远不会有任何细节。

标签: sql sql-server foreign-keys primary-key relationship


【解决方案1】:

我完全同意那些离开 cmets 的观点:最佳答案是更改 OrderDetail.OrderID 的类型以匹配 OrderHeader.ID。

其他任何事情是一个非常糟糕的主意

但是,假设由于某种原因你不能这样做,你可以创建一个外键,......有点......有点。

您可以创建一个将一种数据类型转换为另一种数据类型的计算字段,并在该字段上设置一个外键。注意,为了做到这一点,计算域必须被持久化。

create table OrderHeader ( ID char(12) primary key )

create table OrderDetail ( OrderID char(10),
                           OrderID12 as cast ( OrderID as char(12) )
                           persisted
                           foreign key references OrderHeader(ID)
                           )

insert into OrderHeader ( ID ) values ( 'MOH333' )

insert into OrderDetail ( OrderID ) values ( 'MOH333' )

-- this one fails
insert into OrderDetail ( OrderID ) values ( '777PIR' )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多