2009-06-12 7 views
3

In Postgres haben wir eine Einschränkung definiert, die es im Wesentlichen ermöglicht, die Anzahl der Einträge in einer Tabelle mit einem bestimmten Wert auf eins zu beschränken. Wir haben diese Einschränkung erstellt:Eindeutige Bedingung mit Bedingungen in MYSQL

Erstellen einer eindeutigen Indexliste $ default $ uk auf list_group (visitor_uid) where list_type = 'default';

Dies bedeutet, dass die eindeutige Einschränkung nur angewendet wird, wenn list_type = 'default' ist, sodass es nur eine 'Standardliste' pro Besucher in der Tabelle geben kann.

Es sieht so aus, als ob MySql die zusätzliche wo auf der eindeutigen Einschränkung nicht unterstützt. Gibt es eine andere Möglichkeit, dies im Datenbankschema für MySQL zu unterstützen?

Antwort

2

MYSQL unterstützt solche Arten von Einschränkungen nicht.

Sie sollten stattdessen gespeicherte Prozeduren zum Einfügen von Daten verwenden, damit Sie eine Überprüfung und Validierung durchführen können.

Warum definieren Sie Ihren Standard nicht so, dass er 1 als Primärschlüssel haben muss? Auf diese Weise würde bereits eine normale eindeutige Beschränkung für den PK ausreichen.

Wenn nichts zu Ihnen passt, können Sie auch ein Datenmodell ändern.

0

Eigentlich existiert es. Die meisten Einschränkungen hängen von der Tabelle Engine ab. Ich denke, InnoDB unterstützt dies.

, es zu tun, haben Sie einen eindeutigen Index mit der einzigartigen Kombination hinzuzufügen:

ALTER TABLE visitor ADD UNIQUE unique_default_visitor(visitor_uid, list_type); 
+0

ja - nicht ganz. Das Problem mit dem, was Sie dort haben, ist, dass jede list_group einen eindeutigen list_type für jeden Besucher haben müsste. Das wollen wir nicht. Was wir erreichen wollen, ist, dass jeder Besucher nur eine einzige Listengruppe mit list_type = 'default' hat. Für andere list_types spielt es keine Rolle, ob es Duplikate gibt. – harmanjd

+1

ho, rechts. Dann habe ich keine Möglichkeit, dies in MySQL zu tun, da CHECK Constaint noch nicht von Speicher-Engines unterstützt wird: http://forums.mysql.com/read.php?136,152474,240479#msg-240479. Aber, wie Codymanix sagte, würde ich eher die Datenstruktur ändern, wenn die Durchsetzung dieser Regel in der Datenbank von wesentlicher Bedeutung ist. –

0

ich denn Sie haben würde, einen Auslöser zu schreiben für sie zu überprüfen.

0

ich nie MySQL verwenden, aber vielleicht können Sie einen Index wie folgt erstellen:

CREATE UNIQUE INDEX list$default$uk ON list_group ((CASE WHEN list_type='default' THEN NULL ELSE visitor_uid END)); 

Erläuterung: Ein eindeutiger Index über NULL-Werte nicht kümmern sollte. Stellen Sie daher sicher, dass der Indexausdruck NULL für jede Zeile mit list_type <> 'default' zurückgibt.

+0

Sieht ähnlich aus wie das, was wir für Orakel getan haben (mit einem Dekodierer).Aber das ist, was ich habe, wenn ich es versuche: mysql> CREATE UNIQUE INDEX Liste $ default $ uk ON list_group ((FALL WENN list_type = 'default' THEN NULL ELSE visitor_uid END)); Fehler 1064 (42000): Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MySQL-Server-Version entspricht, für die richtige Syntax, um 'near' zu verwenden (CASE WHEN list_type = 'default' THEN NULL ELSE visitor_uid ENDE)) 'in Zeile 1 mysql> – harmanjd

0

Meine zwei Cent:

warum Sie eine Spalte nicht nur erstellen, den einzigartigen Wert zu speichern (vielleicht kann man es so etwas wie is_list_type_default nennen) und ein anderer alle Werte zu speichern. Wenn Sie dies tun, können Sie eine unique Einschränkung auf die erste Spalte setzen.