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

SQL Server で列の組み合わせに一意の制約を適用するにはどうすればよいですか?

Linda Hamilton
リリース: 2025-01-24 23:32:09
オリジナル
211 人が閲覧しました

How to Enforce Unique Constraints on Column Combinations in SQL Server?

SQL Server の列の組み合わせの一意性制約を確認します

データベーステーブルには同じ列値を持つ複数のレコードが存在する可能性があります。これを回避するには、テーブル内で特定の列の組み合わせが一意であることを要求する一意制約を適用します。

たとえば、テーブルには次の列が含まれています:

  • ID (主キー)
  • 名前
  • アクティブ
  • 個人番号

PersonNumber と Active = 1 の一意の組み合わせを持つレコードが 1 つだけ存在するようにするために必要です。

一意の制約を作成します

テーブルから重複レコードを削除した後、ALTER TABLE ステートメントまたは CREATE UNIQUE INDEX ステートメントを使用して一意制約を追加できます。

ALTER TABLE メソッド

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

CREATE UNIQUE INDEX メソッド

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

重複挿入の処理

SQL Server に例外を返して重複挿入を処理させる代わりに、潜在的な競合を事前にチェックできます。

競合がないか確認してください

例外によるアプリケーションの中断を防ぐために、次のメソッドを使用できます:

  • さまざまなエラー処理手法によるパフォーマンスへの影響: さまざまなエラー処理手法によるパフォーマンスへの影響を検討します。
  • TRY/CATCH に入る前に潜在的な制約違反を確認します: オーバーヘッドを削減するために、例外処理ブロックに入る前に潜在的な競合がないか確認します。

INSTEAD OF トリガーを使用

アプリケーションを変更せずに重複した挿入を処理したい場合は、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 'Did nothing.'; -- 或执行其他处理重复插入的逻辑
  END
END
GO</code>
ログイン後にコピー

次の例は、列の組み合わせに対する一意制約の作成とその機能の検証を示しています。

<code class="language-sql">USE tempdb;
GO

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

-- 成功:
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>
ログイン後にコピー
この例は、一意性制約によって、同じ PersonNumber と Active=1 の組み合わせを持つレコードの重複を防ぐ方法を示しています。

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

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