Yadgar: MySQL 5: Problem mit mehrspaltigem UNIQUE-Index

Hi(gh)!

Die Tabelle sieht so aus:

  
+-----------+----------------------+------+-----+---------+----------------+  
| Field     | Type                 | Null | Key | Default | Extra          |  
+-----------+----------------------+------+-----+---------+----------------+  
| ID        | tinyint(3) unsigned  | NO   | PRI | NULL    | auto_increment |  
| Sendung   | smallint(5) unsigned | NO   | MUL | NULL    |                |  
| Interpret | smallint(5) unsigned | NO   |     | NULL    |                |  
| Teil      | tinyint(3) unsigned  | YES  |     | NULL    |                |  
+-----------+----------------------+------+-----+---------+----------------+  

Hintergrundinformation: die Tabelle speichert Interviews in Radiosendungen; pro Sendung nur ein Interview (daher keine zusätzliche Relationstabelle), jedes Interview hat einen Interpreten als Interview-Partner, kann aber aus mehreren Teilen in mehreren aufeinanderfolgenden Sendungen bestehen. Bei einteiligen Interviews bleibt "Teil" auf NULL.

Eigentlich sollte ich, sobald ich eine bereits in der Tabelle existierende Kombination aus Sendung, Interpret und Teil eingebe, eine Fehlermeldung (abgefangen durch eine selbstprogrammierte Funktion dberror()) bekommen - das passiert aber nicht! Wieso? Was habe ich bei der Definition des Indexes falsch gemacht?

Bis bald im Khyberspace!

Yadgar

  1. Hallo,
    es wäre hilfreich wenn du uns auch deinen Index der Tabelle zeigen würdest und auch wie du den Insert machst.
    Ich nehme an du hast einen Index über die Spalten "Sendung--Interpret--Teil" ?

    Gruss
    werner

    1. Hi(gh)!

      Hallo,
      es wäre hilfreich wenn du uns auch deinen Index der Tabelle zeigen würdest und auch wie du den Insert machst.

      Der Insert sieht so aus:

        
      if ($Teil)  
        $query = "INSERT INTO sendung_interpret (Sendung, Interpret, Teil) VALUES ('".mysql_real_escape_string($ids[0])."','".mysql_real_escape_string($ids[1])."','".mysql_real_escape_string($Teil)."')";  
      else  
        $query = "INSERT INTO sendung_interpret (Sendung, Interpret) VALUES ('".mysql_real_escape_string($ids[0])."','".mysql_real_escape_string($ids[1])."')";  
      
      

      ...je nachdem, ob "Teil" gesetzt wird oder nicht.

      Ich nehme an du hast einen Index über die Spalten "Sendung--Interpret--Teil" ?

      Ja, genau so!

      Bis bald im Khyberspace!

      Yadgar

  2. Tach!

    Bei einteiligen Interviews bleibt "Teil" auf NULL.

    Bei einteiligen Interviews sollte da eine 1 drinstehen. NULL bedeutet (üblicherweise) unbekannt.

    Eigentlich sollte ich, sobald ich eine bereits in der Tabelle existierende Kombination aus Sendung, Interpret und Teil eingebe, eine Fehlermeldung (abgefangen durch eine selbstprogrammierte Funktion dberror()) bekommen - das passiert aber nicht! Wieso?

    Wann immer NULL im Spiel ist, ist das Ergebnis NULL. Das ist selbst beim Vergleichen von NULL mit NULL so. NULL wird im boolschen Kontext auch immer wie false gewertet. Demzufolge kommt beim Vergleichen von a-b-NULL mit a-b-NULL immer false raus. Beide Werte sind also nicht gleich: Bedingung erfüllt.

    Oder gemäß MySQL-Handbuch: For all engines, a UNIQUE index permits multiple NULL values for columns that can contain NULL.

    dedlfix.

    1. Hi(gh)!

      Tach!

      Bei einteiligen Interviews bleibt "Teil" auf NULL.

      Bei einteiligen Interviews sollte da eine 1 drinstehen. NULL bedeutet (üblicherweise) unbekannt.

      Ich habe es bis jetzt auf NULL gelassen, weil ich bei der Ausgabe zwischen ein- und mehrteiligen Interviews unterscheiden will... andernfalls müsste ich eine zusätzliche COUNT-Abfrage hinzufügen, um festzustellen, ob ein Interview ein- oder mehrteilig ist. Könnte ich machen, steht aber im Moment nicht so hoch auf meiner Prioritätenliste...

      Wann immer NULL im Spiel ist, ist das Ergebnis NULL. Das ist selbst beim Vergleichen von NULL mit NULL so. NULL wird im boolschen Kontext auch immer wie false gewertet. Demzufolge kommt beim Vergleichen von a-b-NULL mit a-b-NULL immer false raus. Beide Werte sind also nicht gleich: Bedingung erfüllt.

      Oder gemäß MySQL-Handbuch: For all engines, a UNIQUE index permits multiple NULL values for columns that can contain NULL.

      O.k., das leuchtet ein!

      Bis bald im Khyberspace!

      Yadgar