这更多的是寻求信息,而不是寻求帮助......
我正在升级一些旧数据库(在 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 之间是否存在某种“兼容性”?
答案应该是明显的“是的,这是可能的”,但我找不到任何证据表明这种行为是(被?)允许和/或预期的:我有外键,但不应该创造它。
sql-server ×1