这更像是对信息的寻求,而不是寻求帮助……
我正在升级一些旧数据库(在 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
我在 SO 上找到了一个答案,指出不可能使用具有不同数据类型的 2 列的外键,但提供了一种解决方法,因此问题并不严重。
问题是:是否允许在没有技巧的情况下在具有不同数据类型的字段上创建关系?char 和 varchar 之间是否存在某种“兼容性”?
答案应该是明显的“是的,有可能”,但我找不到任何证据表明这种行为(曾经?)是允许和/或预期的:我有外键,但应该不可能创造它。
挖掘早已被遗忘的盒子,我发现了 nt4 和 SQL-Server 6.5 安装媒体,我可以确认允许使用不同数据类型的外键引用字段。
这是我在 SQL-Server 6.5 上成功运行的语句:
没有尾随分号,否则会出现语法错误。
我无法掌握 sql 7 媒体,所以我不知道它是否也在那个版本上工作。