0

所以,我正在尝试做一些非常简单的事情;更改表并添加外键约束。问题是它给我一个错误,关于列的排序规则不匹配:

列 blah 与在外键 blah 中引用列 blah 的排序规则不同。

我不明白这一点,我到处找。当我查看 SQL 属性页面时,它显示了相同的排序规则 (Latin1_General_CI_AS)。我到处看了,我不知道如何改变它。任何可以提供帮助的人将不胜感激。谢谢!

4

2 回答 2

8

尝试在 SQL Server 中比较两个字符串时,排序规则必须匹配,否则会出现此错误。Collat​​ion 告诉 SQL Server 如何比较字符串(即 CHAR、NCHAR、VARCHAR、NVARCHAR)。排序规则 Latin1_General_CI_AS 使用 Latin1_General 字符集,不区分大小写,区分重音。

在我给你解决方案之前你需要知道一些事情: SQL Server 中有三个级别的排序规则:

  1. 服务器默认排序规则:这是在 SQL Server 安装期间设置的,它定义了用于在服务器上创建的新数据库的默认排序规则。这也是用于系统数据库(包括 TempDB)的默认排序规则。换句话说,如果您创建一个临时表而不指定要使用的排序规则,它将使用服务器的默认值。您可以通过右键单击服务器并选择属性来找到它。
  2. 数据库默认排序规则。这是在数据库中创建表时将使用的排序规则,而无需在创建表时显式指定排序规则。默认情况下,这与服务器的排序规则相同,但可以在创建数据库时指定。如果您备份数据库并在具有不同排序规则的另一台服务器上恢复它,它将保留自己的排序规则,而不是继承服务器的排序规则。您可以通过右键单击数据库并选择属性来看到这一点。
  3. 字段排序规则。这是特定字段的排序规则,并且存在于数据库中的所有字符串类型字段。如果更改数据库的排序规则,它不会更改数据库中所有字符串字段的排序规则;只有那些随后在数据库上创建的字段。您可以在表设计器中使用 sp_help TableName 或右键单击该字段并选择属性来查看此排序规则。

为了解决您的问题,您需要更改您尝试比较的两个字段之一的排序规则,以使它们相同。更改两者以匹配数据库的排序规则可能是您的最佳实践:

ALTER TABLE MyMaster ALTER COLUMN MyMasterKey VARCHAR(30) COLLATE LATIN1_General_CI_AS
ALTER TABLE MyDetail ALTER COLUMN MyMasterKey VARCHAR(30) COLLATE LATIN1_General_CI_AS

然后你就可以定义外键了:

ALTER TABLE MyDetail ADD CONSTRAINT FK_Master_Detail FOREIGN KEY (MyMasterKey) REFERENCES MyMaster(MyMasterKey)
于 2012-05-04T12:13:18.870 回答
1

似乎这两个表或两个字段(外键 - 主键)具有不同的排序规则。你能给我们更多的信息吗?

  1. 你能确认数据库上的排序规则吗?
  2. 你能确认外键字段的排序规则以及引用表的主键吗?
  3. 您在任何地方都使用临时表吗?临时表采用 sql 实例的排序规则。如果数据库是使用不同的排序规则创建的,则可能会出现此问题。

请参阅这篇关于如何检查排序规则的帖子:SQL Authority Blogpost

于 2012-05-04T08:12:52.167 回答