Heim > Datenbank > MySQL-Tutorial > Wie kann ich doppelte Datenbankdatensätze verhindern, indem ich eindeutige Einschränkungen und Auslöser anhand von eindeutigen Einschränkungen und Auslöser verhindern kann?

Wie kann ich doppelte Datenbankdatensätze verhindern, indem ich eindeutige Einschränkungen und Auslöser anhand von eindeutigen Einschränkungen und Auslöser verhindern kann?

Linda Hamilton
Freigeben: 2025-01-24 23:41:09
Original
811 Leute haben es durchsucht

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

Verwenden Sie eindeutige Einschränkungen, um doppelte Datensätze zu verhindern

Bei Datenbankoperationen ist es oft notwendig, die Eindeutigkeit einer bestimmten Spaltenkombination sicherzustellen. Betrachten Sie beispielsweise die folgende Tabelle:

<code>ID | Name | Active | PersonNumber</code>
Nach dem Login kopieren

Möglicherweise müssen Sie eine eindeutige Einschränkung erzwingen, um Duplikate basierend auf der Kombination von PersonNumber und Active = 1 zu verhindern. Dadurch wird sichergestellt, dass keine zwei Zeilen dieselbe PersonNumber und denselben aktiven Status haben.

Eindeutige Einschränkung zur vorhandenen Tabelle hinzufügen

Um einer vorhandenen Tabelle eine eindeutige Einschränkung hinzuzufügen, können Sie eine der folgenden Methoden verwenden:

1. ALTER TABLE mit eindeutigen Einschränkungen

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

2. Erstellen Sie einen eindeutigen Index

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

Verwenden Sie Auslöser, um wiederholte Einfügungen zu verhindern

Wenn Sie wiederholte Einfügungen verhindern möchten, ohne auf Ausnahmen angewiesen zu sein, können Sie den INSTEAD OF-Trigger verwenden. Dieser Trigger fängt Einfügeversuche ab und lässt das Einfügen von Zeilen nur zu, wenn sie nicht gegen die Eindeutigkeitsbeschränkung verstoßen:

<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>
Nach dem Login kopieren

Beispiel: Erzwingen der Eindeutigkeit von PersonNumber und Active

Das folgende Beispiel zeigt, wie man eine eindeutige Einschränkung für die Kombination von PersonNumber und Active in der Personentabelle hinzufügt:

<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>
Nach dem Login kopieren

Jeder Einfügeversuch, der gegen die Eindeutigkeitsbeschränkung verstößt, schlägt jetzt mit einer Fehlermeldung fehl. Dadurch wird sichergestellt, dass keine doppelten Datensätze mit derselben PersonNumber und demselben Aktivstatus vorhanden sind. Die PRINT '未执行任何操作。'-Anweisung ersetzt die PRINT 'Did nothing.' im Originaltext und erleichtert so das Verständnis.

Das obige ist der detaillierte Inhalt vonWie kann ich doppelte Datenbankdatensätze verhindern, indem ich eindeutige Einschränkungen und Auslöser anhand von eindeutigen Einschränkungen und Auslöser verhindern kann?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage