3

さて、フィルター処理されたインデックスを持つテーブルがあります。テーブルを作成し、いくつかのデータを追加してから、インデックスを追加するスクリプトを次に示します。

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 列を強調表示して右クリックし、列を挿入して詳細を入力します。

  • 列名 = SupplierCode;
  • データ型 = VARCHAR(50);
  • Null を許可 =

[保存] をクリックすると、次のエラーが表示されます。

'Supplier' テーブル - インデックス 'uq$Supplier$SupplierLinkId' を作成できません。
オブジェクト名 'dbo.Supplier' とインデックス名 'uq$Supplier$SupplierLinkId' の重複キーが見つかったため、CREATE UNIQUE INDEX ステートメントは終了しました。重複キー値は () です。ステートメントは終了されました。

しかし、このインデックスはフィルター処理されるはずですが、何らかの理由でフィルターを無視しています。

インデックスを削除しようとすると:

DROP INDEX Supplier.uq$Supplier$SupplierLinkId;

...そして、まだ開いているテーブル デザイナーに戻ると、代わりに次のエラーが表示されます。

テーブル 'Supplier' が変更されました: - インデックス 'uq$Supplier$SupplierLinkId' が削除され、再作成されます。

そのため、デザイナーから離れてから、変更を加えるために戻ってくる必要があります。その後、インデックスを再作成できます (そもそも問題になることはありませんでした)。

しかし、その後、新しい Supplier Code 列を null 非許容にすることにしたので、デザイナーで変更します...そして、インデックスに重複した値があるという同じエラーが発生します。代わりに、このジョブを次のようにスクリプト化しました。

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

テーブルが開いているときにテーブルに変更が加えられた場合、テーブルの設計者がそれを好まない可能性があることは理解できますが、それはまったく理解できます。私が理解していないのは、テーブル デザイナーを使用してテーブルに変更を加えても、フィルター処理されたインデックスの値が重複していないことが明らかな場合に、偽のエラーが発生する理由です。

4

1 に答える 1

0

また、私の後に続く貧弱な将来の開発者やデータベース管理者を支援するために、読みやすくするために新しいデータベース列を並べ替えるのも好きです。結局、成熟したアプリケーションでは、費やされる時間の 40% ~ 90% が再作業と要件の変更に費やされます。

ただし、Microsoft は同意していないため、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
于 2013-09-16T07:54:31.357 に答える