Announcement

Collapse
No announcement yet.

Problem bei zusammengesetzten Sekundärindex

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem bei zusammengesetzten Sekundärindex

    Hallo,

    in einer Tabelle sind unter anderem die Felder

    <pre>
    TimeFrom, Typ TIMESTAMP, NOT NULL
    TimeThru, Typ TIMESTAMP
    </pre>

    Nun möchte ich gerne über diese Felder einen zusammengesetzten Sekundärindex setzen.

    Beim Hinzufügen von Datensätzen habe ich bemerkt, dass NULL-Values (was beim Feld TimeThru durchaus vorkommen kann) bei Interbase nicht gerne in einem Index gesehen werden (laut Dokumentation). Früher waren diese beiden Felder vom Typ VARCHAR(10) und es gab keinerlei Schwierigkeiten.

    Hier das Skript-Fragment:

    <pre>
    SET SQL DIALECT 3;

    /* Datenbank erzeugen */

    CREATE DATABASE '<MyDBFile.gdb>'
    USER 'MyUser' PASSWORD 'MyPassword';

    /* Domains der Datenbank festlegen */

    CREATE DOMAIN TDateTime AS TIMESTAMP;
    CREATE DOMAIN TID AS INTEGER;
    CREATE DOMAIN TAddInfo AS VARCHAR(255);

    /* Tabelle MyTable */

    CREATE TABLE MyTable (
    MyTableID TID NOT NULL,
    TimeFrom TDateTime NOT NULL,
    TimeThru TDateTime,
    AddInfo TAddInfo
    );
    ALTER TABLE MyTable
    ADD CONSTRAINT PK_MyTable PRIMARY KEY(MyTableID);
    CREATE UNIQUE ASCENDING INDEX IDX_MyTable ON MyTable(TimeFrom,TimeThru);
    COMMIT WORK;
    </pre>

    Da diese Datenbank auch auf anderen SQL-Servern läuft, möchte ich ungerne bei der Lösung in Probleme kommen, die bei einem Server funktionieren und beim anderen nicht (eben z.B. nicht-benötigte Felder in einem Index).

    Vielen Dank im voraus<br>
    Stephan

  • #2
    Hallo,

    man müsste einmal im SQL-Standard nachlesen, ob sich der InterBase in diesem Punkt korrekt verhält oder nicht. Das Problem tritt erst dann auf, wenn ein 2. Datensatz mit gleichem Wert in <i>TimeFrom</i> angelegt werden soll, bei dem die Spalte <i>TimeThru</i> NULL ist. Wenn es nur darum geht, eindeutige Werte in der Kombination zu erzwingen, könnte man diese Prüfung in einen Trigger auslagern, der über 2 separate Indizes diese Spalteninhalte auswertet und bei Bedarf sein Veto einlegt.

    Beim Microsoft SQL Server 2000 tritt dieses Problem nicht auf, wie der folgende Test demonstriert:
    <pre>
    USE tempdb
    GO
    CREATE TABLE TestTbl (
    RecNo INTEGER NOT NULL IDENTITY PRIMARY KEY,
    Datum1 DATETIME NOT NULL,
    Datum2 DATETIME)
    GO
    CREATE UNIQUE INDEX idxTestTbl ON TestTbl (Datum1,Datum2)
    GO
    INSERT INTO TestTbl (Datum1,Datum2) VALUES ('07:00:00', '07:30:00')
    INSERT INTO TestTbl (Datum1) VALUES ('07:00:00')
    GO
    SELECT * FROM TestTbl
    </pre>

    &#10

    Comment


    • #3
      Null Werte sind in *uniquen* Index bei InterBase nicht zulässig und wenn man die doch reinbekommt (was geht), gibt es z.B, bei der Rücksicherung Ärger (nicht bei der Sicherung).

      Ob das SQL Standardkonform ist? Keine Ahnung! Aber es ist halt so

      Comment

      Working...
      X