Tom: MySQL: Termine threadsicher ohne Überschneidung eintragen

Beitrag lesen

Hello,

Zur Vereinfachung habe ich eine Tabelle zahl benutzt mit den Spalten id und nummer, in die ich eine neue Nummer eintragen will, wenn sie noch nicht vorhanden ist. Selbstverständlich hier NICHT mit einem Unique Index, da der ja für den anderen Anwendungsfall nicht nutzbar wäre.

Schritt 1 wäre geschafft:

insert into zahl (zahl) select distinct 25 from zahl where 25 not in (select zahl from zahl);

Das funktioniert mit MySQL. Kann bestimmt noch vereinfacht werden, bevor man es jetzt umbaut auf den anderen Anwendungsfall...

Die Terminverwaltung funktioniert so auch:

CREATE TABLE termin (
  id int(10) unsigned NOT NULL AUTO_INCREMENT,
  start datetime NOT NULL,
  ende datetime NOT NULL,
  PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci COMMENT='Terminkalender Test';

insert into termin (id, start, ende)
  select distinct null, '2010-11-01 09:00', '2011-11-02 14:00'
    from termin
    where (select count(*)
      from termin
      where ende >= '2010-11-01 09:00' and start <= '2010-11-02 14:00') = 0;

Die affected Rows geben dann Auskunft darüber, ob der Termin noch eingetragen werden konnte.

In der API müsste dann zuvor nur noch die Rahmenbedingung geprüft werden, dass ENDE > ANFANG sein muss.

Aber ohne das Distinct funktioniert meine Variante nicht...

Liebe Grüße aus dem schönen Oberharz

Tom vom Berg

--
 ☻_
/▌
/ \ Nur selber lernen macht schlau
http://bergpost.annerschbarrich.de