Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Menghalang Rekod Pangkalan Data Pendua Menggunakan Kekangan dan Pencetus Unik?

Bagaimanakah Saya Boleh Menghalang Rekod Pangkalan Data Pendua Menggunakan Kekangan dan Pencetus Unik?

Linda Hamilton
Linda Hamiltonasal
2025-01-24 23:41:09821semak imbas

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

Gunakan kekangan unik untuk menghalang rekod pendua

Dalam operasi pangkalan data, selalunya perlu memastikan keunikan gabungan lajur tertentu. Sebagai contoh, pertimbangkan jadual berikut:

<code>ID | Name | Active | PersonNumber</code>

Anda mungkin perlu menguatkuasakan kekangan unik untuk mengelakkan pendua berdasarkan gabungan PersonNumber dan Active = 1. Ini memastikan bahawa tiada dua baris mempunyai status PersonNumber dan Active yang sama.

Tambahkan kekangan unik pada jadual sedia ada

Untuk menambah kekangan unik pada jadual sedia ada, anda boleh menggunakan salah satu kaedah berikut:

1. ALTER JADUAL menggunakan kekangan unik

<code>ALTER TABLE dbo.yourtablename
ADD CONSTRAINT uq_yourtablename UNIQUE(column1, column2);</code>

2. Cipta indeks unik

<code>CREATE UNIQUE INDEX uq_yourtablename
ON dbo.yourtablename(column1, column2);</code>

Gunakan pencetus untuk mengelakkan sisipan berulang

Jika anda ingin menghalang kemasukan berulang tanpa bergantung pada pengecualian, anda boleh menggunakan pencetus BUKANNYA. Pencetus ini memintas percubaan memasukkan dan hanya membenarkan baris disisipkan jika ia tidak melanggar kekangan unik:

<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>

Contoh: Menguatkuasakan keunikan pada PersonNumber dan Active

Contoh berikut menunjukkan cara menambah kekangan unik pada gabungan PersonNumber dan Active dalam jadual Person:

<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>

Sebarang percubaan memasukkan yang melanggar kekangan unik kini akan gagal dengan mesej ralat, memastikan tiada rekod pendua dengan status PersonNumber dan Aktif yang sama. Pernyataan PRINT '未执行任何操作。' menggantikan PRINT 'Did nothing.' dalam teks asal, menjadikannya lebih mudah untuk difahami.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghalang Rekod Pangkalan Data Pendua Menggunakan Kekangan dan Pencetus Unik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn