2011-01-14 9 views
0

Ich habe einen einfachen Kartentisch:Datensätze dynamisch entfernen, wenn bestimmte Spalten = 0; Datenbereinigung

CREATE TABLE `users_individual_cards` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_id` char(36) NOT NULL, 
    `individual_card_id` int(11) NOT NULL, 
    `own` int(10) unsigned NOT NULL, 
    `want` int(10) unsigned NOT NULL, 
    `trade` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `user_id` (`user_id`,`individual_card_id`), 
    KEY `user_id_2` (`user_id`), 
    KEY `individual_card_id` (`individual_card_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; 

ich Ajax muß hinzufügen, und die Datensätze auf Basis von OWN, will sie, und TRADE zu entfernen. Wenn der Benutzer jedoch alle OWN-, WANT- und TRADE-Karten entfernt, werden sie auf Null gesetzt, aber der Datensatz wird in der Datenbank belassen. Ich würde es vorziehen, den Datensatz entfernt zu haben. Wird nach jedem "update" überprüft, ob alle Spalten = 0 die einzige Möglichkeit sind, dies zu tun? Oder kann ich einen bedingten Trigger mit so etwas wie:

//psuedo sql 
AFTER update IF (OWN = 0, WANT = 0, TRADE = 0) DELETE 

Was ist der beste Weg, dies zu tun? Kannst du mit der Syntax helfen?

+0

Sie können einen Trigger nicht zum Aktualisieren von [Löschen von] der gleichen Tabelle wie der Trigger verwenden, da dies sonst zu rekursiven Triggern führt. Nun, in MySQL sowieso nicht, SQL Server und Oracle sind zufrieden damit, wenn es gut gemacht ist. – RichardTheKiwi

Antwort

1

Warum nicht nur zwei Abfragen von PHP (oder anderen Front-End) abfeuern?

update `users_individual_cards` ... 
delete `users_individual_cards` where ... (same condition) and own + want + trade = 0 
+0

Ich dachte darüber nach. Es fühlt sich an wie eine "schmutzige" Art, es zu tun. Einer ist spezifisch, wo der andere eher global ist. Mir geht es gut, wenn es so gemacht wird. Aber ich suche nach einer etwas eleganteren Lösung ... das heißt, wenn es eine gibt. –

+0

Dies ist momentan die einzige Option, da Trigger die Tabelle, der sie zugewiesen sind, nicht manipulieren können. –

1

Der Auslöser wird:


CREATE TRIGGER users_individual_cards_trigger 
    AFTER UPDATE ON users_individual_cards 
    FOR EACH ROW 
    BEGIN 
    DELETE FROM users_individual_cards 
    WHERE 'OWN' = 0 AND 'WANT' = 0 AND 'TRADE' = 0; 
    END$$ 

Die Lösungen werfen die Löschabfrage, da nicht alle Versionen von MySQL-Unterstützung, die es besser sein wird.

+0

Dies ist mehr in die Richtung, was ich suche, ja. Ich betreibe MySQL 5.1. Das scheint nicht für die Version zu funktionieren, die ich ausführe. Ich denke auch, dass das "In" in den Trigger vertippt wurde (also habe ich es entfernt). Danke für eine tolle Lösung! –

+0

Ich konnte den Auslöser hinzufügen, indem ich es auf 'CREATE TRIGGER users_individual_cards_trigger AFTER UPDATE ON Benutzerindividuelle_Cards FÜR JEDE ZEILE LÖSCHEN FROM users_individual_cards WHERE 'OWN' = 0 UND 'WANT' = 0 UND 'TRADE' = 0;' .. Aber es scheint nicht zu funktionieren. Muss ich es irgendwie "aktivieren"? –

+0

Also habe ich herausgefunden, warum der Auslöser nicht funktioniert. Mysql kann die Tabelle, die ihnen zugewiesen wird, auch nicht manipulieren ... http://stackoverflow.com/questions/1582683/mysql-trigger-stored-trigger-ista-ready-used-by-statement-which-invoked-stored-tr –

Verwandte Themen