Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Trigger i procedura składowana
busterek
post
Post #1





Grupa: Zarejestrowani
Postów: 109
Pomógł: 0
Dołączył: 30.07.2006
Skąd: Łódź

Ostrzeżenie: (0%)
-----


Witajcie.
Mam taką tabelę:

fileID
userUD
uniqueFileID
originalFileName

Są w niej jeszcze inne pola, ale one są nieistotne. Po stronie aplikacji wykonuję następujące zapytanie dodające plik do bazy danych:

  1. INSERT INTO files (userID, originalFileName) VALUES ('$userID', '$originalFileName');


Chciałbym teraz po stronie bazy danych dokonać update tego rekordu, wykonując najpierw złączenia wartosci z pól fileID, userID oraz originalFileName, następnie wykonać na tym złączonym ciągu kodowanie SHA1 i tą wartość zapisać w polu uniqueFileID. Jak to zrobić?

Coś zrobiłem, ale nie działa. Poniżej kod triggera i procedury;

  1. DELIMITER $$
  2.  
  3. CREATE PROCEDURE `updateFiles`()
  4. BEGIN
  5. SELECT LAST_INSERT_ID() INTO @lastID FROM files;
  6. SELECT SHA1(CONCAT(fileID, userID, originalFileName)) INTO @UID FROM files WHERE fileID= @lastID;
  7. UPDATE files SET uniqueFileID= @UID WHERE fileID = @lastID;
  8. END
  9.  
  10. DELIMITER ;


  1. DELIMITER $$
  2. DROP TRIGGER IF EXISTS uniqueID
  3. $$
  4. CREATE TRIGGER uniqueID AFTER INSERT ON files
  5. FOR EACH ROW
  6. BEGIN
  7. CALL updateFiles();
  8. END;
  9. $$
  10. DELIMITER ;


Po wywołaniu INSERT dostaję błąd 1442. Jak to zrobić poprawnie?

Ten post edytował busterek 1.12.2013, 11:24:37
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
mmmmmmm
post
Post #2





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


  1. DELIMITER $$
  2. DROP TRIGGER IF EXISTS uniqueID
  3. $$
  4. CREATE TRIGGER uniqueID BEFORE INSERT ON files
  5. FOR EACH ROW
  6. BEGIN
  7. SET NEW.uniqueFileID=SHA1(CONCAT(NEW.fileID, NEW.userID, NEW.originalFileName));
  8. END;
  9. $$
  10. DELIMITER ;

Go to the top of the page
+Quote Post
busterek
post
Post #3





Grupa: Zarejestrowani
Postów: 109
Pomógł: 0
Dołączył: 30.07.2006
Skąd: Łódź

Ostrzeżenie: (0%)
-----


Hmmm. Generalnie działa. Ale wynika mi z tego, że pole fileID nie mogę mieć ustawionego na auto_increment, tylko obsługiwać je ręcznie.A może się mylę?
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #4





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


A może byś sprawdził... W końcu to Twój problem...
Go to the top of the page
+Quote Post
busterek
post
Post #5





Grupa: Zarejestrowani
Postów: 109
Pomógł: 0
Dołączył: 30.07.2006
Skąd: Łódź

Ostrzeżenie: (0%)
-----


Chodzi o to, że sprawdziłem. Wynik jest taki, że to NEW.fileID jest puste. Stąd moje pytanie.
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #6





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


Może dlatego, że to BEFORE. Musi byc BEFORE aby modyfikowa NEW (tak mi się wydaje). Ale myślałem, że już wtedy będzie miał ID... Cóż to MySQL (ja go nie lubię)....A na dodatek w triggerze nie możesz modyfikowac tabeli (UPDATE, DELETE, INSERT), która powoduje wywołanie triggera (niekoniecznie nawet tej, której trigger dotyczy). Takie są ograniczenia MySQL. Daltego na nim nie robię zaawansowanych aplikacji.
Go to the top of the page
+Quote Post
busterek
post
Post #7





Grupa: Zarejestrowani
Postów: 109
Pomógł: 0
Dołączył: 30.07.2006
Skąd: Łódź

Ostrzeżenie: (0%)
-----


W sumie to żaden kłopot. Będę po prostu ręcznie wstawiał fileID z poziomu skryptu. Wtedy NEW.fileID powinno już być. Będę testował. Dzięki. Wielkie.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 26.09.2025 - 00:14