重複レコードを防ぐために一意の制約を使用します
データベース操作では、多くの場合、特定の列の組み合わせの一意性を確保する必要があります。たとえば、次の表を考えてみましょう:
<code>ID | Name | Active | PersonNumber</code>
場合によっては、PersonNumber と Active = 1 の組み合わせに基づいて重複を防ぐために一意の制約を適用する必要があります。これにより、同じ PersonNumber と Active ステータスを持つ行が 2 つ存在しないことが保証されます。
既存のテーブルに一意制約を追加します
既存のテーブルに一意制約を追加するには、次のいずれかの方法を使用できます:
1. 一意制約を使用した ALTER TABLE
<code>ALTER TABLE dbo.yourtablename ADD CONSTRAINT uq_yourtablename UNIQUE(column1, column2);</code>
2. 一意のインデックスを作成します
<code>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>
例: PersonNumber と Active に一意性を適用する
次の例は、Person テーブルの PersonNumber と Active の組み合わせに一意制約を追加する方法を示しています。
<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</code>
ステートメントは、元のテキストの PRINT '未执行任何操作。'
を置き換えて理解しやすくしています。 PRINT 'Did nothing.'
以上が固有の制約とトリガーを使用してデータベース レコードの重複を防ぐにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。