Nieznana kolumna, error code 1054

0

Cześć,
Muszę napisać prosty trigger który będzie sprawdzał czy dana wartość już istnieje ale nie wiem czemu nie rozpoznaje mi mojej kolumny. Tak wygląda baza:

CREATE DATABASE IF NOT EXISTS zarzadzanie;
CREATE TABLE IF NOT EXISTS sklep
(
nazwa VARCHAR(255) NOT NULL,
adres VARCHAR(255),
PRIMARY KEY (nazwa)
);

INSERT INTO sklep (nazwa) VALUES ('Sklep_1');
CREATE TABLE IF NOT EXISTS towar
(
nazwa VARCHAR(255) NOT NULL,
producent VARCHAR(255),
PRIMARY KEY (nazwa)
);
INSERT INTO towar (nazwa) VALUES ('Towar_1');

DROP TABLE IF EXISTS sprzedaz;
CREATE TABLE IF NOT EXISTS sprzedaz
(
nazwasklepu VARCHAR(255) NOT NULL,
adressklepu VARCHAR(255),
nazwatowaru VARCHAR(255) NOT NULL,
producent VARCHAR(255),
AktualnaData TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
cena FLOAT,
FOREIGN KEY (nazwaSklepu) REFERENCES sklep(nazwa),
FOREIGN KEY (nazwaTowaru) REFERENCES towar(nazwa)
);

Tak wygląda trigger:

DELIMITER //
CREATE TRIGGER dodaj
BEFORE INSERT ON sprzedaz
FOR EACH ROW BEGIN
	DECLARE wiadomosc VARCHAR(255);
	IF NEW.nazwatowaru = nazwatowaru THEN
		SET wiadomosc = 'Taki sklep juz istnieje';
	END IF;
END //
DELIMITER ;

A tak wygląda wstawianie:

INSERT INTO sprzedaz (nazwasklepu, nazwatowaru) 
SELECT s.nazwa, t.nazwa FROM sklep AS s, towar AS t 
WHERE s.nazwa = 'Sklep_1' AND t.nazwa = 'Towar_1';

Oraz błąd:

Error Code: 1054. Unknown column 'nazwatowaru' in 'field list'
0

a czym wg Ciebie jest nazwatowaru tutaj IF NEW.nazwatowaru = nazwatowaru THEN?

0

jak chcesz sprawdzić czy wartość ju istnieje w tabeli to zamiast triggera użyj indeksu unikalnego. A jak już musi być trigger to trzeba zrobić zapytanie w stylu SELECT count(*) ile FROM tabela WHERE pole = NEW.pole i sprawdzić ile takich rekordów jest. Chociaż nie wiem czy mysql pozwoli w triggerze zapytać o dane z tabeli na której on jest

0

Tylko potrzebuję jakiegoś myku bo gdy używam tego SELECTA to dostaje error, że nie można zwracać wartości z TRIGGERA :(

0

no to ci pisałem, że pewnie nie pozwoli i że do takich rzeczy to są indeksy unikalne

0

No ja rozumiem ale mam tak w treści zadania:

INSERT. Przy wstawieniu wiersza do tabeli Sprzedaz najpierw należy sprawdzić, czy wiersz
już istnieje. Jeśli tak, kończymy z odpowiednim komunikatem błędu, natomiast jeśli nie,
przechodzimy dalej i wykonujemy następujące czynności:

Więc nie bardzo mogę użyć innego rozwiązania :(

0

Możesz utworzyć procedurę, w niej sprawdzić czy rekord istnieje. Takie rozwiązanie również pozwoli na dodanie unikatowego indeksu jak pisał @abrakadaber

0

Wymyśliłem coś takiego:

DELIMITER //
CREATE PROCEDURE sprawdz_przed_wstawieniem(nazwa_sklepu VARCHAR(255), nazwa_towaru VARCHAR(255))
BEGIN
	DECLARE wiadomosc VARCHAR(255);
    DECLARE ile INT;
	
	IF ((SELECT count(*) ile FROM sprzedaz WHERE nazwasklepu = nazwa_sklepu OR nazwatowaru = nazwa_towaru)>0) THEN
		SET wiadomosc = 'Taki sklep juz istnieje';
	END IF;
    

END //
DELIMITER ;

Ale nie wiem czemu nie wyświetla mi wiadomości mimo iż sprawdziłem czy istnieje coś takiego bo sam SELECT wyświetla 1

0

a czemu miałby Ci cokolwiek wyświetlić? Przecież SET nic nie wyświetla.

0
DELIMITER //
CREATE TRIGGER dodaj
BEFORE INSERT ON sprzedaz
FOR EACH ROW 
BEGIN
	DECLARE wiadomosc VARCHAR(255);
    DECLARE ile_sklepow INT;
    DECLARE ile_towarow INT;
	SET ile_sklepow = (SELECT count(*) ile FROM sprzedaz WHERE nazwasklepu = NEW.nazwasklepu);
    SET ile_towarow = (SELECT count(*) ile FROM sprzedaz WHERE nazwatowaru = NEW.nazwatowaru);
	IF (ile_sklepow >0) THEN    
		SET @msg = 'Taki sklep juz istnieje';
		SIGNAL SQLSTATE '02000' SET MESSAGE_TEXT = @msg;      
	END IF;
    IF (ile_towarow >0) THEN
		SET @msg = 'Taki towar juz istnieje';
		SIGNAL SQLSTATE '02000' SET MESSAGE_TEXT = @msg;       
	END IF;
END //
DELIMITER ;

Tak to zrobiłem :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1