2016-06-12 6 views
0

I erstellt einzigartige Verbindung Index:Erstellen eindeutiger Compound Index, wo ein Feld in Mysql null sein

Alter Table TableX Add Unique Index `UniqueRecord` (A,B,C,D) 

Das Problem ist, dass manchmal C NULL sein kann.

Ich bemerkte, dass

`Insert IGNORE` 

noch doppelte Datensätze in einigen Fällen war das Hinzufügen und das stellte sich heraus zu sein, wenn diese eingehenden Datensätze C als NULL hatte.

testete ich die Hypothese, dass dies ein Problem war, indem Sie:

Select concat(A,B,C,D) as Index from TableA where C is NULL 

Und Index in jedem dieser Fälle tatsächlich NULL war. Sobald ich das Null-Feld aus der Auswahl entfernen:

Ich bekomme die erwarteten String-Werte vs NULL.

Also die Frage ist, anders als ein Update wie set C='' where C is NULL gibt es eine Möglichkeit, den Index einzurichten, so dass es funktioniert? Ich verabscheue es, den Index A,B,D einfach so zu machen, dass das unerwünschte Duplikate einführt, wenn C tatsächlich nicht NULL ist.

Update: Ich habe versucht IfNull in der Indexerstellung verwenden, aber Mysql tat es nicht so:

Alter Table TableA Add Unique Index UniqueLocator (A,B,IfNull(C,''),D 

Mysql sagte:

[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'C,''),D)' at line 1

Antwort

0

Ja MySQL NULL-Werte in eindeutigen Indizes ermöglicht, Was ist das Richtige? Aber Sie können Spalte C als NOT NULL definieren, wenn Sie das nicht mögen.

+0

Tha ist eine ziemlich einfache Lösung, danke. Ich denke immer noch darüber nach, ob das zu unerwarteten Problemen mit bestehenden Codes/Abfragen führen kann. – user3649739

0

MySQL - aber nicht alle Datenbanken - erlauben doppelte NULL Werte in eindeutigen Indizes. Ich glaube, der ANSI-Standard ist in diesem Punkt ziemlich zweideutig (oder vielleicht sogar widersprüchlich). Sie haben grundsätzlich zwei Möglichkeiten.

Die erste besteht darin, einen Standardwert für die Spalte zu definieren. Dies mag nicht in Bezug auf Code ansprechend sein, aber es wird zumindest einen Fehler beim Duplizieren von Einfügungen erzeugen. Wenn beispielsweise "C" eine Fremdschlüsselreferenz zu einer automatisch inkrementierten ID ist, können Sie -1 oder 0 als Standardwert verwenden. Wenn es sich um ein Datum handelt, können Sie das Nulldatum verwenden.

Die andere Lösung ist ein Trigger, bei dem Sie manuell nach den doppelten Werten suchen, bevor Sie eine Einfügung (oder ein Update) vornehmen.

+0

@GordongLinoff Ich habe versucht, IfNull in der Indexbeschreibung zu verwenden, d. H.'Andere Tabellen-TabelleA eindeutigen Index UniqueLocator hinzufügen (A, B, IfNull (C, ''), D), aber das hat mir nicht gefallen. Im Moment verändere ich das Feld als Leere Zeichenfolge vs NULL und versuche nur festzustellen, wo dies anderen Code beschädigen könnte. – user3649739

+0

@ user3649739. . . Eine Möglichkeit besteht darin, einen speziellen Wert zu verwenden und dann auf die Tabelle zuzugreifen, indem Sie eine Ansicht verwenden, die sie in einen "NULL" -Wert zurückversetzt. –

+0

@Linoff Danke, bisher hat das Feld auf Empty String als Standard vs NULL geändert scheint das Problem gelöst zu haben. – user3649739

Verwandte Themen