Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: default value jako inne pole
Forum PHP.pl > Forum > Bazy danych > MySQL
misty
hej, czy jest mozliwe aby dla danego pola ustawic jako wartosc default value = inne pole?

normalnie jak chce dodac default value to wystarczy taki sql:

  1. ALTER TABLE test ALTER COLUMN name SET DEFAULT 'jakas wartosc'


a ja bym chciala cos takiego:
  1. ALTER TABLE test ALTER COLUMN name SET DEFAULT main_name


czyli za kazdym razem jak bede robila insert i nie podam wartosci dla 'name', to wstawi sie tam wartosc z pola 'main_name'


czy takie cos jest w ogole mozliwe?

pzdr,
misty




nospor
I tak i nie.

Nie nie jest możliwe.
Tak, jest możliwe tworząc trigger na tabeli, który będzie wypełnił drugie pole czym ci się zamarzy.
misty
ale z triggerem to jest chyba tak, ze ja nie moge zrobic 'trigger after insert' na tej samej tabeli? czyli jesli robie insert do tabeli A, to jest tak trigger wywolywany 'after insert'? to chyba musi byc wtedy tak, ze ten trigger moze byc wywolany ale na tabeli B? dobrze mysle? pamietam ze kiedys wlasnie mialam z tym problem i wyszlo ze nie moge na tej samej tabeli.. mozliwe ze to byl trigger na update, nie pamietam dokladnie.
nospor
Ale w triggerze będziesz robiła update. A trigger wywoływać masz na insert - więc chyba powinno być ok.

Ale to piszę chyba, bo sam nie jestem pewien a nie chce mi się sprawdzać smile.gif
mortus
Niestety w ciele TRIGGERa nie można wykonywać zapytania zmieniającego zawartość tabeli (UPDATE, INSERT, itp.), która tego TRIGGERa wywołuje. Można natomiast przed wstawieniem nowych (NEW) wartości sprawdzić je i ewentualnie zmodyfikować:
  1. CREATE TRIGGER `check_field` BEFORE INSERT ON `table_name`
  2. FOR EACH ROW BEGIN
  3. IF `NEW`.`field2` IS NULL THEN
  4. SET `NEW`.`field2` = `NEW`.`field1`;
  5. END IF;
  6. END;
nospor
Tak czy siak trigger pozostaje wink.gif
Dzięki mortus za dokładniejsze wyjaśnienie. Jak już pisałem z triggerów nie jestem zbyt pewny smile.gif - za rzadko ich używam.
mortus
Proszę bardzo. Kiedyś miałem z tym problem, to teraz już wiem.
Innego sposobu na rozwiązanie problemu nie ma, chyba że w PHP lub tym podobnym.
Pozdrawiam smile.gif
misty
mortus, probowalam wykonac tego trigger'a aby zobaczyc jak to dzialac bedzie i czy mi to wystarczy, ale Twoj sql jest bledny. Niestety na takim triggerze:

  1. CREATE TRIGGER check_field BEFORE INSERT ON test
  2. FOR EACH
  3. ROW BEGIN
  4. IF NEW.test_id2 IS NULL
  5. THEN
  6. SET NEW.test_id2 = NEW.test_id


phpmyadmin mowi mi:
  1. #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 6


ten blad to mi sie kojarzy z apostrofami, no ale je usunelam.. ja sie na triggerach za bardzo nie znam, ale z tego co pamietam to wyglada mi to na ok sql'a, dlatego nie mam za bardzo pomyslu co tu moze byc nie tak. A moze Tobie rzuca sie cos w oczy?

pzdr
mortus
Brakuje END IF i END, a także średnika ;:
  1. CREATE TRIGGER check_field BEFORE INSERT ON test
  2. FOR EACH
  3. ROW BEGIN
  4. IF NEW.test_id2 IS NULL
  5. THEN
  6. SET NEW.test_id2 = NEW.test_id;
  7. END IF;
  8. END;


EDIT
No i wyżej nie użyłem apostrofów, tylko gravisów (`).
misty
z END probowalam bo kojarzylam ze powinno byc, ale nie pamietalam o END IF. Niemniej jednak, phpmyadmin caly czas sie czepia!

dostaje:
  1. Zapytanie SQL:
  2.  
  3. CREATE TRIGGER check_field BEFORE INSERT ON test
  4. FOR EACH
  5. ROW BEGIN
  6. IF NEW.test_id2 IS NULL
  7. THEN
  8. SET NEW.test_id2 = NEW.test_id;
  9.  
  10.  
  11. MySQL zwrócił komunikat:
  12.  
  13. #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 6
  14.  


i krzyzyk mi stawia pomiedzy linijkami
IF NEW.test_id2 IS NULL
THEN


Nie mam pojecia dlaczego tak jest, moze to wina phpmyadmin? Niestety nie mam dostepu przez konsole do mysql'a, mam wystawiony dostep jedynie przez phpmyadmin..
mortus
No tak. W phpMyAdminie trzeba jeszcze użyć DELIMITERa:
  1. DELIMITER |
  2. CREATE TRIGGER `check_field` BEFORE INSERT ON `test` FOR EACH ROW BEGIN
  3. IF `NEW`.`test_id2` IS NULL THEN
  4. SET `NEW`.`test_id2` = `NEW`.`test_id`;
  5. END IF;
  6. END;
  7. |
  8. DELIMITER ;
misty
dokladnie o to mi chodzilo, dzieki wielkie!!
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.