引用具有不同数据类型的字段的现有外键(char(8) 和 varchar(8))

Pao*_*olo 6 sql-server

这更多的是寻求信息,而不是寻求帮助......

我正在升级一些旧数据库(在 sql 2005 和兼容性级别 70 上运行,我怀疑它们从 sql 6.5 开始就在线)以摆脱几台旧服务器并部署 SQL Server 2012 或 2014。

我不得不处理一些现在不受支持的 sql 排序规则,所以我删除了一些索引和外键。在尝试恢复它们时,我被这个错误阻止了:

消息 1778,级别 16,状态 0,第 2
行列“dbo.Table1.IDColumn”与引用外键“Foreign_key”中的“Table2.ColumnFK”列的数据类型不同。

第一个字段声明为varchar(8),第二个字段声明为a,char(8)因此消息是正确的。

我在一个副本上进行所有测试,所以我仔细检查了生产数据库,外键在那里,将一个char字段与一个varchar字段链接起来。

在编写约束脚本时,这就是我得到的(这是给出错误的脚本):

ALTER TABLE [dbo].[Table2]
WITH NOCHECK ADD  CONSTRAINT [Foreign_key]
FOREIGN KEY([ColumnFK]) REFERENCES [dbo].[Table1] ([IDColumn])
GO

ALTER TABLE [dbo].[Table2]
NOCHECK CONSTRAINT [Foreign_key]
GO
Run Code Online (Sandbox Code Playgroud)

我在 SO 上找到了一个答案,指出不可能使用具有不同数据类型的 2 列来获得外键,但提供了一种解决方法,因此问题并不重要。

问题是:是否曾经允许在没有技巧的情况下在具有不同数据类型的字段上创建关系?char 和 varchar 之间是否存在某种“兼容性”?

答案应该是明显的“是的,这是可能的”,但我找不到任何证据表明这种行为是(被?)允许和/或预期的:我有外键,但不应该创造它。

Pao*_*olo 8

深入研究早已被遗忘的盒子,我发现了 nt4 和 SQL-Server 6.5 安装媒体,我可以确认允许使用具有不同数据类型的外键引用字段。

这是我在 SQL-Server 6.5 上成功运行的语句:

create table tbl1 (code char(8) primary key (code))
create table tbl2 (code varchar(8) primary key (code))
alter table tbl1 add constraint FK foreign key (code) references tbl2 (code)
Run Code Online (Sandbox Code Playgroud)

没有尾随分号,否则会出现语法错误。

我无法掌握 sql 7 媒体,所以我不知道它是否也适用于该版本。

  • 这确实是从 6.5 到 7 的重大更改。请参阅 http://sqlmag.com/sql-server/migrating-sql-server-65-70。我不知道兼容性保持了多久。大概只要6.5数据库兼容。SQL Server 7 安装介质很难找到,因为它因 Java 许可问题而被撤回。 (4认同)
  • @Paolo - 您会在 SQL Server 7 的发行说明中寻找“重大更改”,但我认为 2000 年之前的 SQL Server 在线文档并不多。 (3认同)