Nieznana kolumna, error code 1054

Odpowiedz Nowy wątek
2015-12-06 15:20
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'

Pozostało 580 znaków

2015-12-06 18:09
0

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


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
miałem nadzieję, że wartością wstawianą i sprawdzaną - barslo 2015-12-06 19:19
jaką sprawdzaną? Skąd? - abrakadaber 2015-12-06 20:32
no z tabeli sprzedaż? - barslo 2015-12-06 20:52
odpowiadaj w postach! - abrakadaber 2015-12-06 21:08

Pozostało 580 znaków

2015-12-06 21:10
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


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.

Pozostało 580 znaków

2015-12-07 14:48
0

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

Pozostało 580 znaków

2015-12-07 14:57
0

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


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.

Pozostało 580 znaków

2015-12-07 15:00
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 :(

edytowany 1x, ostatnio: barslo, 2015-12-07 15:01

Pozostało 580 znaków

2015-12-07 15:24
0

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

edytowany 1x, ostatnio: woolfik, 2015-12-07 15:25

Pozostało 580 znaków

2015-12-07 15:43
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

Pozostało 580 znaków

2015-12-07 15:46
0

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


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
Właśnie zauważyłem, że brakuje mi SELECTA :) teraz muszę to upchać jakoś w tiggerze :d - barslo 2015-12-07 15:59

Pozostało 580 znaków

2015-12-07 16:12
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 :)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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