gpt4 book ai didi

SQL Server 过滤索引 - 谁能解释我看到的这个错误?

转载 作者:行者123 更新时间:2023-12-02 04:59:31 24 4
gpt4 key购买 nike

好的,所以我有一个带有过滤索引的表。这是创建表、添加一些数据然后添加索引的脚本:

CREATE TABLE Supplier (
SupplierId INT NOT NULL,
SupplierLinkId INT NULL,
SupplierName VARCHAR(50));
INSERT INTO Supplier VALUES (1, 2, 'Test Supplier 1');
INSERT INTO Supplier VALUES (2, NULL, 'Test Supplier 2');
INSERT INTO Supplier VALUES (3, NULL, 'Test Supplier 3');
CREATE UNIQUE NONCLUSTERED INDEX uq$Supplier$SupplierLinkId ON Supplier (SupplierLinkId) WHERE SupplierLinkId IS NOT NULL;

然后我决定要在我的表中添加一个新列,例如供应商代码,出于可维护性的原因,我不希望它位于表的末尾。所以我不能使用:

ALTER TABLE Supplier ADD SupplierCode VARCHAR(50);

我进入表设计器,突出显示 SupplierLinkId 列并右键单击,插入列并输入详细信息:

  • 列名称 = 供应商代码;
  • 数据类型 = VARCHAR(50);
  • 允许空值 =

当我点击“保存”时,出现此错误:

'供应商'表- 无法创建索引“uq$Supplier$SupplierLinkId”。
CREATE UNIQUE INDEX 语句终止,因为找到对象名称“dbo.Supplier”和索引名称“uq$Supplier$SupplierLinkId”的重复键。重复键值为 ()。声明已终止。

但是这个索引应该被过滤,由于某种原因它忽略了过滤器。

如果我尝试删除索引:

DROP INDEX Supplier.uq$Supplier$SupplierLinkId;

...然后回到我仍然打开的表设计器,我得到了这个错误:

表“供应商”已更改:- 索引 'uq$Supplier$SupplierLinkId' 已删除并将重新创建。

所以我必须完全退出设计器,然后再返回进行更改。然后我可以重新创建我的索引(这本来不应该是一个问题)。

但后来我决定我希望新的供应商代码列不可为空,所以我去设计器中更改它...并得到关于具有重复值的索引的相同错误。相反,我已经编写了这项工作的脚本:

ALTER TABLE Supplier ALTER COLUMN SupplierCode VARCHAR(50) NOT NULL;

现在我明白了,如果在表格打开时对其进行更改,表格设计者可能会不喜欢它,这是完全可以理解的。我不明白的是,为什么我不能使用表设计器对我的表进行更改,而不会收到关于我的过滤索引具有重复值的虚假错误,而实际上它显然没有。

最佳答案

我还喜欢重新排序新的数据库列以提高可读性,以帮助那些在我之后的可怜的 future 开发人员和数据库管理员。毕竟,在成熟的应用程序中,40% - 90% 的时间将花在返工和变更需求上。

但是,微软不同意,所以没有列重新排序 SQL 但你可以在 Microsoft Connect 上投票给它如果你喜欢浪费时间。他们更喜欢您使用临时表并重新创建您的表,如下所示...

--rename table to free up the name
EXEC sp_rename 'Supplier', 'Supplier_backup'
GO

--create the table again with the new column in the order that you like
CREATE TABLE Supplier (
SupplierId INT NOT NULL,
SupplierCode VARCHAR(50),
SupplierLinkId INT NULL,
SupplierName VARCHAR(50))
GO

--copy the data back in
INSERT INTO Supplier (SupplierId,SupplierCode,SupplierLinkId,SupplierName)
SELECT SupplierId,NULL,SupplierLinkId,SupplierName
FROM Supplier_backup
GO

--add the index
CREATE UNIQUE NONCLUSTERED INDEX uq$Supplier$SupplierLinkId ON Supplier (SupplierLinkId)
WHERE SupplierLinkId IS NOT NULL
GO

--cleanup the old table
DROP TABLE Supplier_backup
GO

关于SQL Server 过滤索引 - 谁能解释我看到的这个错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18105880/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com