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).
@NorbertvanNobelen ok, fügte ich in der zusätzlichen 'composite_index' in die Frage. Wie würde ich es dann tun? – David542
@NorbertvanNobelen cool - können Sie das als Antwort und ich werde es mit dem SQL akzeptieren. – David542
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. –