2016-05-30 8 views
0

ich eine Datenbank mache, und ich habeErhalten von String-Attribut

CREATE TABLE reserva ( 
id_clinica  NUMBER, 
APOSITIVO  DECIMAL(10,4), 
ANEGATIVO   DECIMAL(10,4), 
BPOSITIVO  DECIMAL(10,4), 
BNEGATIVO   DECIMAL(10,4), 
ABPOSITIVO  DECIMAL(10,4), 
ABNEGATIVO   DECIMAL(10,4), 
OPOSITIVO  DECIMAL(10,4), 
ONEGATIVO   DECIMAL(10,4), 
); 

CREATE TABLE donante ( 
dni_donante  VARCHAR(9), 
fecha_alta DATE, 
movil VARCHAR(9), 
nombre VARCHAR(20), 
apellido1 VARCHAR(20), 
apellido2 VARCHAR(20), 
tipo_sangre VARCHAR(15), 
); 

In der Tabelle donante, das Attribut "tipo_sangre" immer "APOSITIVO", "ANEGATIVO", "BPOSITIVO", BNEGATIVO sein“ usw.

ich mag einen Trigger machen, dass, wenn eine Zeile auf einer anderen Tabelle einfügen, wird die „tipo_sangre“ von donante erhalten und eine Reihe in dem es correspondant Attribute der Tabelle reserva.

gibt es ein Möglichkeit, dies zu tun, außer eine Variable für tipo_sangre zu deklarieren und einen Schalter zu machen c Ase?

Vielen Dank im Voraus :)

+0

uhm, deklarieren Sie lieber eine Tabelle mit jeder möglichen Blutgruppe und fügen Sie einfach einen Fremdschlüsselwert in Ihre Reserviertabelle für die korrekte Blutgruppe ein. – SomeJavaGuy

+0

Ich denke 'CASE ... WANN ...' ist der Weg zu gehen. Theoretisch können Sie es mit dynamischen SQL tun, aber es ist IMO nicht wert. –

+0

Erstens glaube ich nicht, dass dies wirklich eine gute Verwendung von Triggern ist. Zweitens scheint es, dass Ihre RESERVA-Tabelle nur eine laufende Zählung darüber führt, wie viele Vorkommen von etwas in einer dritten Tabelle existieren, die Sie nicht beschrieben haben. Wenn dem so ist, ist es im Allgemeinen ein schlechtes Design, Daten zu speichern, die "on demand" berechnet werden können und sollten. – EdStevens

Antwort

1

Wenn die erste Tabelle einfach gemeint ist man von Blut für die Zeilen in der zweiten Tabelle die Zählung geben, ich das Datenbank-Design zu überdenken würde empfehlen. Sie benötigen nur eine "Dimensionstabelle" für Blutgruppen (eine einzelne Spalte, acht Zeilen, die die Namen der Blutgruppen anzeigen). Diese Spalte sollte der Primärschlüssel sein. Dann sollte tipo-sangre in donate eine Fremdschlüsseleinschränkung haben, die auf diese Bluttypen-Tabelle verweist. Schließlich benötigen Sie für die Zählung keine Tabelle, sondern eine Ansicht. Basierend auf einer Abfrage wie dieser:

select count(case tipo_sangre when 'apositivo' then 1 end) as apositivo, 
     count(case tipo_sangre when 'anegativo' then 1 end) as anegativo, 
     ..... 
     count(case tipo_sangre when 'onegativo' then 1 end) as onegativo 
from donate 

Erstellen Sie keine separate Tabelle, um diese Zählungen zu speichern; Das kann nur in der Zukunft zu Problemen führen, da Sie redundante Daten haben, die sich aus verschiedenen Gründen irgendwann widersprechen können.

+0

Danke, ich werde tatsächlich die Datenbank neu gestalten, da es mehr Sinn macht, die Art von Blut als separates Attribut auf dem Tisch reserva zu haben :) –