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 サイトの他の関連記事を参照してください。