2016-06-28 3 views
2

Imagine ich einige Tabelle erstellen:Best Practices zum Bestätigen einer Bedingung in SQL beim Erstellen einer Tabelle?

CREATE TABLE mytable AS 
... 

Jetzt möchte ich einige Plausibilitätsprüfung durchzuführen, überprüfen eine Bedingung für jeden Datensatz von mytable. wahr ich dieses Problem so zu überprüfen, ob das Ergebnis einer anderen Abfrage Null Ergebnisse zurückgibt Rahmen könnte .

SELECT count(*) 
FROM mytable 
WHERE something_horrible_is_true 

Gibt es eine empfohlene Standardmethode, um hier einen Fehler zu erzeugen, wenn die Zählung nicht gleich Null ist? Um etwas passieren zu lassen, dass, wenn ich diese Healthity-Check-Abfrage mit einem java.sql.Statement ausführen, wird eine SQLException ausgelöst?

Ist das ein vernünftiger Ansatz? Oder ist dies eine bessere Methode, um zu erzwingen, dass beim Erstellen einer Tabelle immer eine Bedingung erfüllt ist? (Ich benutze Postgresql.)

+3

Suchen Sie nach relationalen Integritätsbedingungen, überprüfen Sie Integritätsbedingungen, nicht Null-Integritätsbedingungen usw. –

Antwort

1

erstellen Funktion Ausnahme zu erhöhen:

create or replace function raise_error(text) returns varchar as $body$ 
begin 
    raise exception '%', $1; 
    return null; 
end; $body$ language plpgsql volatile; 

Dann können Sie es in regelmäßigen SQLs verwenden:

SELECT case when count(*) > 0 then raise_error('something horrible is true!') end 
FROM mytable 
WHERE something_horrible_is_true 

Hier finden Sie die SQL-Ausnahme, wenn es Zeilen, die die something_horrible_is_true Bedingung erfüllen .

Es gibt auch einige komplexere Verwendungsbeispiele:

SELECT 
    case 
    when count(*) = 0 then raise_error('something horrible is true!')::int 
    else count(*) 
    end 
FROM mytable 
WHERE something_horrible_is_true 

Returns zählen oder Ausnahme steigen, wenn nichts gefunden.

update mytable set 
    mydatefield = 
    case 
     when mydatefield = current_date then raise_error('Can not update today''s rows')::date 
     else '1812-10-10'::date 
    end; 

Verhindert, dass einige Zeilen (dies ist ein etwas konstruiertes Beispiel, aber es zeigt noch eine andere Nutzung Art und Weise) aktualisieren
... und so weiter.

1

Kennen Sie Trigger? Postresql bietet eine gute Unterstützung für Trigger, insbesondere mit dem pgsql laguange.

Ein Trigger ist eine Funktion (Check), die immer bei einem Ereignis ausgeführt wird: Einfügen, Aktualisieren, Löschen. Sie können die Funktion vor oder nach dem Ereignis aufrufen.

Ich glaube, sobald Sie dieses Konzept kennen, können Sie ein Online-Tutorial finden, um Ihnen zu helfen, Ihr Ziel zu erreichen.

Ein allgemeiner Ansatz könnte wie folgt aussehen:

CREATE FUNCTION trigger_function() RETURN trigger AS 
$$ 
DECLARE c integer; 
BEGIN 
SELECT count(*) into c FROM mytable WHERE something_horrible_is_true; 
IF c>0 then RAISE EXCEPTION 'cannot have a negative salary'; 
END IF; 
return new; 
END; 
$$ LANGUAGE plpgsql; 

Und Sie danach

CREATE TRIGGER trigger_name BEFORE INSERT 
    ON table_name 
    FOR EACH ROW 
    EXECUTE PROCEDURE trigger_function() 

Beide Codeabschnitte pqsql sind auszuführen.

Verwandte Themen