SQL Server の列の組み合わせの一意性制約を確認します
データベーステーブルには同じ列値を持つ複数のレコードが存在する可能性があります。これを回避するには、テーブル内で特定の列の組み合わせが一意であることを要求する一意制約を適用します。
たとえば、テーブルには次の列が含まれています:
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 に例外を返して重複挿入を処理させる代わりに、潜在的な競合を事前にチェックできます。
例外によるアプリケーションの中断を防ぐために、次のメソッドを使用できます:
アプリケーションを変更せずに重複した挿入を処理したい場合は、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>
以上がSQL Server で列の組み合わせに一意の制約を適用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。