2016-03-18 6 views
0

Ich habe die folgenden drei Felder in der Datenbank:Erstellen einer MySQL-insert/update Integrität Trigger

  • Name
  • Geburt
  • Lage

  • composite_index

Ich möchte ihnen eine einzigartige Beschränkung auferlegen, so dass th e folgende nicht erlaubt ist:

"David-20140101-NULL" 
"David-20140101-NULL" 

Weil ich NULL als Ist-Wert (wie '') zählen möchten, kann ich ALTER TABLE ADD UNIQUE KEY (name,birth,location) nicht tun. Wie würde ich einen INSERT+UPDATE Trigger auf dem obigen hinzufügen, um das compositive_index Hilfsfeld zu aktualisieren?

+0

@NorbertvanNobelen ok, fügte ich in der zusätzlichen 'composite_index' in die Frage. Wie würde ich es dann tun? – David542

+0

@NorbertvanNobelen cool - können Sie das als Antwort und ich werde es mit dem SQL akzeptieren. – David542

+0

Sie versuchen, das Unbeschreibliche zu beschränken. Wenn dies das ist, was Sie wollen, können Sie genauso einfach die Positionspalte 'NOT NULL DEFAULT '-''aufsetzen, so dass die Markierung für eine nicht gesetzte Position automatisch der Wert' - 'ist und nicht NULL ist. –

Antwort

1

Da es in mysql immer noch keine funktionsbasierten Indizes gibt, müssen Sie eine Helferspalte erstellen (Name zB composite_index) (die Sie mit einem Trigger verwalten können). Diese Helper-Spalte enthält dann den eindeutigen Index, der Ihre Anforderungen vollständig erfüllt.

Um dies zu arbeiten, müssen Sie zwei Trigger erstellen. Ein Insert-Trigger und ein Vor-Update-Trigger. Diese müssen eine Linie haben dort wie folgt:

CREATE TRIGGER {unique triggername} AFTER INSERT ON {table} 
BEGIN 
UPDATE {table} SET composite_index=CONCAT(yourvalues) WHERE id=new.id; 
END; 

CREATE TRIGGER {unique triggername} BEFORE UPDATE ON {table} 
BEGIN 
UPDATE {table} SET composite_index=CONCAT({yourvalues}) WHERE id=new.id; 
END; 

In diesem {yourvalues} sind die new.{columnname}

Und Sie haben einen eindeutigen Index hinzuzufügen:

CREATE INDEX idx_un_1 ON {table}(composite_index); 

Dieser Index jetzt stellt sicher, dass ein Datensatz nicht als Duplikat eingefügt werden kann

Sie müssen sehen, ob es vor oder nach den Triggern sein muss:

  • Für die update die before funktioniert und ist am besten: Auf diese Weise das Update auf Eindeutigkeit überprüft wird, bevor das Update ausgeführt wird, und nicht schnell, wenn Sie haben eine Einzigartigkeit Konflikt;
  • für insert Ich denke, es muss ein After-Trigger sein).