Gustaf Mossakowski wrote:
> CREATE TABLE IF NOT EXISTS `nachrichten_medien` (
> `nm_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
> `nachricht_id` int(10) unsigned NOT NULL DEFAULT '0',
> `medium_id` int(10) unsigned NOT NULL DEFAULT '0',
> `reihenfolge` smallint(5) unsigned NOT NULL DEFAULT '1',
> PRIMARY KEY (`nm_id`),
> UNIQUE KEY `nachricht_medium` (`nachricht_id`,`medium_id`),
> UNIQUE KEY `reihenfolge` (`reihenfolge`,`nachricht_id`)
> ) ENGINE=MyISAM;
>
> Die Daten sehen z. B. so aus:
>
> +-------+--------------+-----------+-------------+
> | nm_id | nachricht_id | medium_id | reihenfolge |
> +-------+--------------+-----------+-------------+
> | 125 | 169 | 1177 | 2 |
> | 124 | 169 | 1178 | 1 |
> | 126 | 169 | 1179 | 3 |
> +-------+--------------+-----------+-------------+
>
> Wie tausche ich am einfachsten den Wert im Feld reihenfolge, z. B. so,
> dass bei nm_id 125 reihenfolge = 1 ist, bei nm_id 124 reihenfolge = 2?
>
> So etwas geht nicht:
>
> mysql> UPDATE nachrichten_medien
> SET reihenfolge = CASE nm_id
> WHEN 125 THEN 1
> WHEN 124 THEN 2
> END
> WHERE nm_id IN (124, 125);
> ERROR 1062 (23000): Duplicate entry '2-169' for key 'reihenfolge'
>
> Gibt es da etwas oder geht das nicht direkt?
Da gibt es was, ein mySQL-Problem :-)
Natürlich müsste das so gehen, aber mySQL kriegt's nicht auf die Reihe,
sondern ändert stur ein physikalischen Record nach dem anderen und
überprüft jedesmal sofort den Constraint.
Zwei mögliche Lösungen:
#1
Schmeiss den UNIQUE "reihenfolge" einfach raus, ist der tatsächlich zu
irgendwas nütze? Ein Sortieren geht auch wenn's nicht eindeutig ist.
(Ich würde wahrscheinlich auch die Spalte nm_id rausschmeissen, aber das
ist ein anderes Thema).
#2
Mach drei Updates und nimm einen Dummy-Wert:
UPDATE nachrichten_medien
SET reihenfolge = 99999
WHERE nm_id = 124;
UPDATE nachrichten_medien
SET reihenfolge = 1
WHERE nm_id = 125;
UPDATE nachrichten_medien
SET reihenfolge = 2
WHERE nm_id = 124;
Eventuell gibt's auch eine andere ENGINE als MyISAM, die solche
Basisoperationen ohne Verrenkungen unterstützt?
Dieter