2017-07-26 13 views
0

Ich versuche, den folgenden Index zu erstellen;Fehler "Funktionen im Indexausdruck müssen als IMMUTABLE gekennzeichnet sein, nicht als Zeitstempel

CREATE INDEX idx_concat_paostartno_paostartsuff ON 
    dmv_os_addbase_residential (concat(pao_start_number || pao_start_suffix)); 

Ich bekomme den Fehler;

ERROR: functions in index expression must be marked IMMUTABLE`

Ich denke, das das Mischen von Arten ist, wie pao_start_number ist der Typ bigint und pao_start_suffixvarchar ist. Ich habe versucht zu lösen als;

CREATE INDEX idx_concat_paostartno_paostartsuff ON 
    dmv_os_addbase_residential (concat((pao_start_number :: text) || pao_start_suffix)) 

aber gleicher Fehler.

Bin ich richtig bei der Identifizierung der Fehlerursache und wie kann ich sie beheben? Ich bin mit Postgres 9.6

Antwort

2

Sie wollen wahrscheinlich

CREATE INDEX idx_concat_paostartno_paostartsuff 
    ON dmv_os_addbase_residential ((pao_start_number || pao_start_suffix)); 

können Dieser Index nur für Anfragen wie

SELECT * 
FROM dmv_os_addbase_residential 
WHERE pao_start_number || pao_start_suffix <operator> <constant>; 

verwendet werden, wo <operator> eines = ist, <, <=, > oder >= .

+0

Ich tat, danke. Ich sehe das "CONCAT" war mein Problem, warum ist das? –

+1

Der Operator '||' ist 'IMMUTABLE', während die Funktion' concat' 'STABLE' ist. Der Grund dafür ist, dass "concat" mit einem "beliebigen" Argumenttyp operieren kann, wobei die Argumente in "text" umgewandelt werden und nicht alle Typcasts in 'text'' 'IMMUTABLE' sind (zB Casting von' Zeitstempel mit Zeitzone' nach ' Text 'hängt vom Parameter' TimeZone' ab. –

Verwandte Themen