Cześć,
mam za zadanie aby np. w kolumnie Ilosc wartość była większa niż 0. Nie byłoby problemu gdybym mógł sobie to sprawdzić na poziomie aplikacji, jednak tym razem mam mieć sprawdzanie danych na poziomie bazy danych. A więc napisałem sobie triggera.
CREATE TABLE sprzedaz (
Id INT AUTO_INCREMENT PRIMARY KEY,
KlientID INT,
ProduktNumer VARCHAR( 100 ),
Ilosc INT NOT NULL,
Cena FLOAT NOT NULL,
Data TIMESTAMP DEFAULT NOW(),
);
CREATE TABLE sprzedaz_check (
Id INT AUTO_INCREMENT PRIMARY KEY,
KlientID INT,
ProduktNumer VARCHAR( 100 ),
Ilosc INT NOT NULL,
Cena FLOAT NOT NULL,
Data TIMESTAMP DEFAULT NOW(),
);
DROP TRIGGER IF EXISTS before_sprzedaz_insert;
DELIMITER |
CREATE TRIGGER before_sprzedaz_insert
BEFORE INSERT ON sprzedaz_check
FOR EACH ROW
BEGIN
DECLARE amount INTEGER;
IF NEW.Ilosc = 0 THEN SET amount=1;
ELSE SET amount=NEW.Ilosc;
END IF;
INSERT INTO sprzedaz VALUES( NULL, NEW.KlientID, NEW.ProduktNumer, amount, NEW.Cena, NEW.Data );
END|
DELIMITER ;
Problem jest tego typu, że pisząc triggera nie mogłem operować na tabeli, z której został wywołany trigger, a więc byłem zmuszony (chyba) stworzyć nową tabelę (sprzedaz_check) i do niej wrzucac dane, a jeśli dane się zgadzają to przerzucam je do tabeli sprzedaz (no prawie, tak naprawdę to koryguję, ale to nieistotne). Jednak rozwiązanie jest niechlujne i bardzo nieoptymalne (bo po co dublować wartości), moża to jakoś inaczej rozwiązać?
Pozdrawiam i dzięki za pomoc.
//edit
może pytanie z innej beczki, czy jest możliwe aby po sprawdzeniu danych w triggerze anulować dodanie rekordu, jeśli będą złe? Jeśli to się da to cała reszta na górze jest już wtedy bez znaczenia ;)