Ich habe eine Spalte wie folgt definiert:
data_url character varying(32768) NOT NULL
und EINZIGARTIGE Einschränkung für diese Spalte:
CONSTRAINT unique_data_url UNIQUE (data_url)
Wenn ein großes Objekt in die Tabelle eingefügt wird, wird die folgende Fehlermeldung angezeigt:
ERROR: index row requires 32584 bytes, maximum size is 8191
Wie kann PostgreSQL eingestellt werden, um Objekte zu indizieren, die größer als 8191 Zeichen sind? Platz und Geschwindigkeit sind kein Problem. Es ist eine selten geänderte Tabelle mit höchstens Hunderten von Zeilen.
Umgebung: PostgreSQL 9.3.6, Fedora 20 x64
CONSTRAINT unique_data_url_hash UNIQUE (MD5(data_url))
Antworten:
Wie von @Josh Kupershmidt und @JoeNahmias vorgeschlagen, besteht die Lösung darin, UNIQUE für md5-Hash mit dem langen Wert zu verwenden. PostgreSQL 9.3 unterstützt jedoch keine Ausdrücke in UNIQUE-Einschränkungen, sodass ein Index verwendet werden muss, der Ausdrücke unterstützt:
quelle
PostgreSQL erstellt einen Index zur Unterstützung der UNIQUE-Einschränkung. Sie können ein so großes Feld nicht indizieren. Wie @ josh-kupershmidt vorgeschlagen hat, erstellen Sie die Einschränkung für einen Hash des Feldes, und Sie sollten in Ordnung sein, außer bei Hash-Kollisionen.
quelle