Einzelnen Beitrag anzeigen
  #1  
Alt 03.09.2004, 02:18:32
tapferesschneid tapferesschneid ist offline
Junior Member
 
Registriert seit: Jun 2003
Beiträge: 194
Zeile einfach überspringen bei Unique-Verletzung

Code:
## Diese Tabelle existiert schon und ist gefüllt
## (»id« ist hier nicht der Primary Key):

CREATE TABLE be_backup (
  backup_id int(10) unsigned NOT NULL auto_increment,
  aend timestamp(14) NOT NULL,
  login tinyint(3) unsigned default '0',
  id int(11) unsigned NOT NULL default '0',
  ma tinyint(4) default NULL,
  a_ue tinyint(3) unsigned default NULL,
  email varchar(150) default NULL,
  PRIMARY KEY  (backup_id),
  KEY id (id)
) TYPE=MyISAM;


## Jetzt möchte ich eine Tabelle, die folgende Form hat:

CREATE TABLE ma_link 
  (
  id SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
  be_id SMALLINT(5) UNSIGNED,
  ma_id TINYINT(3) UNSIGNED,
  beginn DATE,
  PRIMARY KEY (id)
  );

## Das klappt auch.

## In der Zieltabelle darf es für jeden Wert »be_id« nur 
## verschiedene Werte »beginn« geben. Deshalb setze ich 
## einen Unique-Index auf die beiden Felder:

ALTER TABLE ma_link ADD UNIQUE be_date_unique (be_id, beginn);


## Mit folgendem Statement versuche ich nun, das jeweils älteste 
## Änderungsdatum pro »id« (ja, es gibt mehrere Einträge) und »ma«
## in die Zieltabelle zu bekommen.

INSERT INTO ma_link (be_id, ma_id, beginn) 
    SELECT id, ma, min(aend) AS d
    FROM be_backup
    WHERE ma IS NOT NULL 
        AND ma != 0
    GROUP BY id, ma
    ORDER BY d DESC;

## Ohne vorher gesetzten Unique-Index klappt das auch -- mit ihm kommt
## immer dann eine Fehlermeldung, wenn erstmals ein doppelter 
## Eintrag auftaucht (dafür ist der Unique-Index ja auch gedacht), 
## allerdings bricht dann auch der ganze Befehl ab.

## Wie überrede ich MySQL dazu weiterzumachen bzw. hat jemand eine
## bessere Idee für das Problem?
Mit Zitat antworten