ホームページ > データベース > mysql チュートリアル > 固有の制約とトリガーを使用してデータベース レコードの重複を防ぐにはどうすればよいですか?

固有の制約とトリガーを使用してデータベース レコードの重複を防ぐにはどうすればよいですか?

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

How Can I Prevent Duplicate Database Records Using Unique Constraints and Triggers?

重複レコードを防ぐために一意の制約を使用します

データベース操作では、多くの場合、特定の列の組み合わせの一意性を確保する必要があります。たとえば、次の表を考えてみましょう:

<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>
ログイン後にコピー
一意制約に違反する挿入の試みは失敗し、エラー メッセージが表示されるようになり、同じ PersonNumber と Active ステータスを持つ重複レコードが存在しないことが保証されます。

ステートメントは、元のテキストの PRINT '未执行任何操作。' を置き換えて理解しやすくしています。 PRINT 'Did nothing.'

以上が固有の制約とトリガーを使用してデータベース レコードの重複を防ぐにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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