Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[PostgreSQL] Grossschrift und Verbinden

76 views
Skip to first unread message

Volker Englisch

unread,
Feb 28, 2018, 9:00:07 AM2/28/18
to
Hallo!

Ich habe eine Tabelle "finnisch", die so aussieht:

| finnisch | character varying(40) | not null
| deutsch | character varying(50) | not null
| [...]
| schluessel | character varying(90)

Nun möche ich erreichen, dass keine doppelten, identischen Werte
gespeichert werden, unabhängig von Gross- und Kleinschrift. Dazu habe
ich die Spalte "schluessel" vorgesehen. Dort hätte ich gerne die Werte
der Spalten "finnisch" und "deutsch" zusammenhängend in Grossschrift
stehen, um diese anschliessend als UNIQUE zu definieren. Dazu habe ich
eine Function erstellt:

CREATE OR REPLACE FUNCTION schluessel_gross() RETURNS trigger AS $schluessel_gross$
BEGIN
NEW.schluessel = (UPPER(finnisch.finnisch) || UPPER(finnisch.deutsch));
RETURN NEW;
END;
$schluessel_gross$ LANGUAGE plpgsql;

... und dann einen Trigger:

CREATE TRIGGER schluessel_gross BEFORE INSERT OR UPDATE on finnisch FOR
EACH ROW EXECUTE PROCEDURE schluessel_gross();

Ein Insert ergibt jetzt folgenden Fehler:

FEHLER: fehlender Eintrag in FROM-Klausel für Tabelle »finnisch«
ZEILE 1: SELECT (UPPER(finnisch.finnisch) || UPPER(finnisch.deutsch)...
^
ANFRAGE: SELECT (UPPER(finnisch.finnisch) || UPPER(finnisch.deutsch))
KONTEXT: PL/pgSQL function "schluessel_gross" line 2 at Zuweisung

Scheinbar stehe ich gerade auf dem Schlauch. Sieht vielleicht jemand
den Fehler auf Anhieb?

Tim Landscheidt

unread,
Feb 28, 2018, 10:48:48 AM2/28/18
to
In dem Trigger musst Du mit NEW.finnisch bzw. NEW.deutsch
auf den Wert zugreifen (ungetestet). Du solltest aber auch
ohne Trigger auskommen und einen Index auf einen Ausdruck
benutzen können:

| CREATE UNIQUE INDEX finnisch_indexname
| ON finnisch (UPPER(finnisch) || UPPER(deutsch));

Ich finde das einfacher zu lesen.

Tim

Volker Englisch

unread,
Feb 28, 2018, 1:00:07 PM2/28/18
to
Tim Landscheidt schrieb:
> v...@rsli.inka.de (Volker Englisch) wrote:

>> FEHLER: fehlender Eintrag in FROM-Klausel für Tabelle »finnisch«
>> ZEILE 1: SELECT (UPPER(finnisch.finnisch) || UPPER(finnisch.deutsch)...
>> ^
>> ANFRAGE: SELECT (UPPER(finnisch.finnisch) || UPPER(finnisch.deutsch))
>> KONTEXT: PL/pgSQL function "schluessel_gross" line 2 at Zuweisung
>
> In dem Trigger musst Du mit NEW.finnisch bzw. NEW.deutsch
> auf den Wert zugreifen (ungetestet).

Das war es. Wald - Bäume. Danke.

> Du solltest aber auch ohne Trigger auskommen und einen Index auf
> einen Ausdruck benutzen können:
>
> | CREATE UNIQUE INDEX finnisch_indexname
> | ON finnisch (UPPER(finnisch) || UPPER(deutsch));

FEHLER: Syntaxfehler bei »||«

Vielleicht liegts an der etwas älteren Version von PostgreSQL.

> Ich finde das einfacher zu lesen.

Da muss ich Dir allerdings zustimmen.

Volker

Tim Landscheidt

unread,
Feb 28, 2018, 2:13:31 PM2/28/18
to
v...@rsli.inka.de (Volker Englisch) wrote:

> […]

>> Du solltest aber auch ohne Trigger auskommen und einen Index auf
>> einen Ausdruck benutzen können:

>> | CREATE UNIQUE INDEX finnisch_indexname
>> | ON finnisch (UPPER(finnisch) || UPPER(deutsch));

> FEHLER: Syntaxfehler bei »||«

> Vielleicht liegts an der etwas älteren Version von PostgreSQL.

> […]

Nein, es liegt daran, dass ich es nicht getestet hatte:

| CREATE UNIQUE INDEX finnisch_indexname
| ON finnisch ((UPPER(finnisch) || UPPER(deutsch)));

sollte funktionieren (also Klammern um den Ausdruck herum).

Tim

Volker Englisch

unread,
Mar 1, 2018, 4:10:07 AM3/1/18
to
Tim Landscheidt schrieb:
> v...@rsli.inka.de (Volker Englisch) wrote:
>
>>> Du solltest aber auch ohne Trigger auskommen und einen Index auf
>>> einen Ausdruck benutzen können:
>
>>> | CREATE UNIQUE INDEX finnisch_indexname
>>> | ON finnisch (UPPER(finnisch) || UPPER(deutsch));
>
>> FEHLER: Syntaxfehler bei »||«
>
> Nein, es liegt daran, dass ich es nicht getestet hatte:
>
> | CREATE UNIQUE INDEX finnisch_indexname
> | ON finnisch ((UPPER(finnisch) || UPPER(deutsch)));

Perfekt. Ich hatte zwar verschiedene Klammerversionen probiert, aber
wohl nicht die richtige.

Danke Dir!

Volker
0 new messages