ホームページ > データベース > mysql チュートリアル > SQL Server の複数の列に一意の制約を適用するにはどうすればよいですか?

SQL Server の複数の列に一意の制約を適用するにはどうすればよいですか?

Linda Hamilton
リリース: 2025-01-24 23:37:12
オリジナル
391 人が閲覧しました

How to Enforce Unique Constraints on Multiple Columns in SQL Server?

SQL Server での複数列の一意制約の実装

複数の列にわたって値の一意の組み合わせを確保することは、データの整合性を維持するために重要です。 SQL Server では、指定した列に一意の制約または一意のインデックスを実装することでこれを実現できます。

一意の制約の必要性を特定する

提供された例は、Person テーブル内の PersonNumber フィールドと Active フィールドの一意の組み合わせを保証する必要性を強調しています。これにより、一意のアクティブな個人番号ごとに 1 つのレコードのみが許可される、特定の個人の複数のエントリが防止されます。

一意の制約を追加します

この制限を強制するには、次の構文を使用して一意の制約を追加できます:

<code class="language-sql">ALTER TABLE dbo.yourtablename ADD CONSTRAINT uq_yourtablename UNIQUE(column1, column2);</code>
ログイン後にコピー

また、一意のインデックスを作成することもできます:

<code class="language-sql">CREATE UNIQUE INDEX uq_yourtablename ON dbo.yourtablename(column1, column2);</code>
ログイン後にコピー

両方のメソッドの目的は同じで、指定された列の組み合わせに基づいて重複レコードを抑制することです。

効率を維持する

一意の制約を実装するときは、パフォーマンスへの影響を必ず考慮してください。これらはデータの整合性を保証しますが、制約に頻繁に違反すると挿入操作でオーバーヘッドが発生する可能性もあります。この場合、INSTEAD OF トリガーを使用して無効な挿入の実行を阻止し、防止することを検討してください。

<code class="language-sql">CREATE TRIGGER dbo.BlockDuplicatesYourTable ON dbo.YourTable INSTEAD OF INSERT AS
BEGIN
  SET NOCOUNT ON;

  IF NOT EXISTS (SELECT 1 FROM inserted AS i 
    INNER JOIN dbo.YourTable AS t
    ON i.column1 = t.column1
    AND i.column2 = t.column2
  )
  BEGIN
    INSERT dbo.YourTable(column1, column2, ...)
      SELECT column1, column2, ... FROM inserted;
  END
  ELSE
  BEGIN
    PRINT '插入操作被阻止,因为该组合已存在。'; -- 提供用户反馈
  END
END
GO</code>
ログイン後にコピー

潜在的な不確実性を防ぐために、トリガーが挿入操作をブロックした場合は必ずユーザーにフィードバックを提供してください。

このソリューションを提供された例に適用すると、次のテーブル構造になります:

<code class="language-sql">CREATE TABLE dbo.Person
(
  ID INT IDENTITY(1,1) PRIMARY KEY,
  Name NVARCHAR(32),
  Active BIT,
  PersonNumber INT
);
GO

ALTER TABLE dbo.Person ADD CONSTRAINT uq_Person UNIQUE(PersonNumber, Active);
GO</code>
ログイン後にコピー

次の例に示すように、PersonNumber と Active の組み合わせに基づく重複レコードの挿入が禁止されるようになりました。

<code class="language-sql">-- 成功
INSERT dbo.Person(Name, Active, PersonNumber)
  VALUES(N'foo', 1, 22);
GO

-- 成功
INSERT dbo.Person(Name, Active, PersonNumber)
  VALUES(N'foo', 0, 22);
GO

-- 失败
INSERT dbo.Person(Name, Active, PersonNumber)
  VALUES(N'foo', 1, 22);
GO</code>
ログイン後にコピー

以上がSQL Server の複数の列に一意の制約を適用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート