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
Lepaskan: 2025-01-24 23:41:09
asal
811 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

2. Cipta indeks unik

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

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan