AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi [SQL] problematische NULL-Wete
Thema durchsuchen
Ansicht
Themen-Optionen

[SQL] problematische NULL-Wete

Ein Thema von Hansa · begonnen am 29. Jun 2004 · letzter Beitrag vom 1. Jul 2004
Antwort Antwort
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#1

[SQL] problematische NULL-Wete

  Alt 29. Jun 2004, 22:28
Hi,

ich habe hier Ärger mit den NULL-Werten in meiner DB. Wie es aussieht sollte man die wohl besser gänzlich vermeiden, wenn es denn geht. Da ich einen BI-Trigger verwende, um die ID zu erhalten habe ich mir überlegt, daß wohl nichts dagegen spricht, auch die anderen Felder mit 0 (eben nicht mit NULL) oder mit ' ' (Blank) vorzubesetzen. Oder ist das doch nicht so gut ?
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von r_kerber
r_kerber

Registriert seit: 11. Feb 2003
Ort: Trittau
3.538 Beiträge
 
Delphi XE Professional
 
#2

Re: [SQL] problematische NULL-Wete

  Alt 30. Jun 2004, 07:43
Moin Hansa,

das geht IMHO nur gut, wenn die Zahl 0 keine Bedeutung hat. Es ist schon ein Unterschied zwischen 0 und "nicht definiert". Du mußt dies also von Fall zu Fall entscheiden!
  Mit Zitat antworten Zitat
nieurig

Registriert seit: 26. Apr 2004
113 Beiträge
 
Delphi 6 Professional
 
#3

Re: [SQL] problematische NULL-Wete

  Alt 30. Jun 2004, 07:55
und ...
bei richtig dynamischer Verwaltung der Daten dürfte der Speicherverbrauch etwas geringer sein (wenn es denn interssiert )

Man kann sich sonst nur zur Regel machen alle Felder in denen NULL vorkommen kann für Vergleiche usw. mit Hilfe von Funktionen definiert umzuwandeln.
bei Access z.B. via nz(Feldname,"")

Aber man vergißt es eben gern.
Niels
Erspare Dir die Gedanken über ungelegte Eier !!!
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#4

Re: [SQL] problematische NULL-Wete

  Alt 30. Jun 2004, 09:21
Zitat von Hansa:
Oder ist das doch nicht so gut
Jupp, das ist nicht so gut.

Stelle dir vor, du hast zwei Foreign Keys von Tabelle A auf Tabelle B & C, sagen wir A_B und A_C.
Wenn du zwar in A einen DS hast, der B referenziert, aber NICHT C, könntest du ganz einfach das Feld A_C leer lassen. Bei einer 0 wird er dir auf's Dach steigen, da du in C wohl keine 0 als PK hast.

Das NULL-Problem lässt sich oftmals ganz esay über die Funktion nvl lösen.
Ist der erste Parameter NULL, wird der zweite ausgegeben.
SQL-Code:
SELECT A.IrgendWas
      ,B.IrgendWas
      ,C.IrgendWas
FROM A, B, C
WHERE nvl(A.A_B, -1) = B.PK(+) AND
      nvl(A.A_C, -1) = C.PK(+)
Aber Vorsicht: Bei manchen DBs versagt die Indexierung, wenn man über das Ergebnis einer Funktion verknüpft.

Wenn du aber _weißt_ (nicht glaubst ), dass die FKs nie leer sind, würde ich eine NOT NULL Constaraint an die Spalte hängen.
Dieses "Default 0" halte ich persönlich für Unsinn. Bei Feldern, die keine anderen Tabellen referenzieren, oder die keine "wichtigen" Daten enthalten (zum Bleistift der Vor- & Zuname in einer Kontakttabelle sollten auch NOT NULL sein) können doch auch leere Werte rein. (Die wirst du wohl auch nicht benutzen, um Tabellen in einer Abfrage zu verknüpfen, dafür hast du ja die Schlüssel).


Zitat von nieurig:
bei richtig dynamischer Verwaltung der Daten dürfte der Speicherverbrauch etwas geringer sein (wenn es denn interssiert )
Sorry, aber ich kapiere da den Zusammenhang zu Hansas Problemchen nicht.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#5

Re: [SQL] problematische NULL-Wete

  Alt 30. Jun 2004, 12:55
Das Problem stellte sich so heraus, daß mit folgender Konstruktion keine Daten zurückgeliefert wurden :
SELECT * FROM RECHNUNG WHERE ID_ART = :ID_ART AND ID_KUNDE = :ID_KUNDE Der Standard ist jedoch, daß der Parameter ID_KUNDE in 95% der Fälle nicht gebraucht wird. Die DB hat in diesen Fällen NULL genommen und deshalb schlug das SELECT fehl. Ich habe deshalb vor, zu jeder Tabelle einen 0-ten Datensatz (also alles 0 oder ' ') anzulegen und dessen Werte für die Referenzen zu nutzen. Dann wären keine NULL-Werte mehr da.
Gruß
Hansa
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

Re: [SQL] problematische NULL-Wete

  Alt 30. Jun 2004, 13:16
Zitat von Hansa:
Das Problem stellte sich so heraus, daß mit folgender Konstruktion keine Daten zurückgeliefert wurden :
SELECT * FROM RECHNUNG WHERE ID_ART = :ID_ART AND ID_KUNDE = :ID_KUNDE Der Standard ist jedoch, daß der Parameter ID_KUNDE in 95% der Fälle nicht gebraucht wird. Die DB hat in diesen Fällen NULL genommen und deshalb schlug das SELECT fehl. Ich habe deshalb vor, zu jeder Tabelle einen 0-ten Datensatz (also alles 0 oder ' ') anzulegen und dessen Werte für die Referenzen zu nutzen. Dann wären keine NULL-Werte mehr da.
Das würde ich nicht tun. Besser so:
SELECT * FROM RECHNUNG WHERE ID_ART = :ID_ART AND (ID_KUNDE = :ID_KUNDE OR ID_KUNDE IS NULL) NULL-Werte sind dazu da, verwendet zu werden, wenn keine Information über den Inhalt eines Feldes vorhanden ist. Natürlich muss man seine Abfragen auf die Gegebenheiten abstimmen.
Andreas
  Mit Zitat antworten Zitat
nieurig

Registriert seit: 26. Apr 2004
113 Beiträge
 
Delphi 6 Professional
 
#7

Re: [SQL] problematische NULL-Wete

  Alt 1. Jul 2004, 09:50
@Robert_g
Zitat:
Sorry, aber ich kapiere da den Zusammenhang zu Hansas Problemchen nicht.
Hatte nichts mit seinem Problem zu tun aber mit der Überlegung auf Null-Werte zu verzichten um keine Probleme zu haben.

Ich bin ebenfalls der Meinung, dass das Ersetzen der Nullwerte inhaltlich schlechter ist als die Null-Werte im Datensatz zu speichern. In einigen Fällen könnte das auch ein Beitrag zur Reduzierung des Speicherbedarfes in der Datenbank sein.

Zitat:
Das NULL-Problem lässt sich oftmals ganz esay über die Funktion nvl lösen.
Das ist eben DB abhängig.
Wie ich schon sagte, müßte man bei Access nz() verwenden.
Beim MSSQL-Server heißt die Funktion isnull() usw.

Niels

Edit: Fehler behoben
Erspare Dir die Gedanken über ungelegte Eier !!!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz