Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: jakie zrobic zapytanie nadajace kolejne wartosci
Forum PHP.pl > Forum > Bazy danych > MySQL
piotrekkr
witam mam problem mam tabele ForumDzialy i mam tam kolumny DzialId Nazwa Opis DataUtworzenia i Kolejnosc. Chce wstawic wiersz jakis i zeby on mial w kolumnie Kolejnosc najwieksza dotychczasowa wartosc z tej kolumny powiekszona o 1.

proboiwalem czagos takiego :

Kod
INSERT INTO `ForumDzialy` SET `DzialId`= null ,`Nazwa` = 'aaaaa', `Opis` = 'aaaaa',`DataUtworzenia` = '2006-03-21', `Kolejnosc`= (SELECT MAX(`Kolejnosc`) FROM `ForumDzialy`)+1

i wyskoczyl komunikat

Kod
ERROR 1093 (HY000): You can't specify target table 'ForumDzialy' for update in FROM clause


nie wiem czy to wogole sie da zrobic w jednym zapytaniu.
pomocy
bronx
w jednym zapytaniu nie zrobisz dwóch takich rzeczy. Jednym zapytaniem pobierasz najwyższą wartość, dodajesz jeden i drugim zapytaniem dodajesz już nowy rekord
piotrekkr
wydaje mi sie ze to jest mozliwe tylko ja nie wiem jak to zrobic. chyba zadam to samo pytanie w dziale mysql
nospor
Cytat
chyba zadam to samo pytanie w dziale mysql
ani mi się waż winksmiley.jpg proponuje zapoznac sie z regulaminem.

ps: sam tam przeniosę smile.gif
piotrekkr
sori nie wiedzialem i przenioslem ide przeczytac regulamin

przeczytalem regulamin smile.gif troche zajmuje przy okazji okazalo sie ze to jednak prawda ze nie da rady jednym zapytaniem. W manualu napisali takie cos
Cytat
Error 1093 (ER_UPDATE_TABLE_USED)
SQLSTATE = HY000
Message = "You can't specify target table 'x'
for update in FROM clause"

This error occurs in cases such as the following:

UPDATE t1 SET column2 = (SELECT MAX(column1) FROM t1);

You can use a subquery for assignment within an UPDATE statement because subqueries are legal in UPDATE and DELETE statements as well as in SELECT statements. However, you cannot use the same table (in this case, table t1) for both the subquery's FROM clause and the update target.


trzeba bedzie recznie no nic trudno sie mowi.
spenalzo
Cytat(piotrekkr @ 2006-03-22 15:33:48)
witam mam problem mam tabele ForumDzialy i mam tam kolumny DzialId Nazwa Opis DataUtworzenia i Kolejnosc. Chce wstawic wiersz jakis i zeby on mial w kolumnie Kolejnosc najwieksza dotychczasowa wartosc z tej kolumny powiekszona o 1.

Według mnie ustawienie pola na auto_increment chyba rozwiąząłoby problem
piotrekkr
chodzi o to ze ja juz mam pole DzialId ktore jest auto_increment i proimary key dodanie auto_increment nic mi nie da bo ja planuje usuwanie dzialow i zmiane kolejnosci a chce zeby wciaz byly po koleji wszystkie pola, wiec pole tego typu odpada. Ale dziaki za zainteresowanie. Juz mam pomysl jak to zrobic. wystarczy odpowiednia funkcje napisac.
bigZbig
Do pozycjonowania wpisow powinienes uzyc dodatkowego pola, a nie pola identyfikatora i to z ustawiona opcja auto_increment, albo wylacz auto_incremetn bo sie jedno z drugim wyklucza.
piotrekkr
no wlasnie to dodatkowe pole do pozycjonowania nazywa sie u mnie Kolejnosc a nie DzialId smile.gif
art
Ja robie to w ten sposób:

- dodaje w bazie pole 'kolejnosc'
- przy dodawaniu nowego rekordu poprzez skrypt w pole kolejnosc wstawiam sobie znacznik czasu (znacznik jest unikalny wiec masz pewnosc ze kazde pole bedzie mialo inny numerek - wiekszy od poprzedniego):

Cytat
// za pomocą funkcji date() pobieram znacznik czasu
$kolejnosc=date("U");


  1. INSERT
  2. INTO nazwa_tabeli
  3. (tytul, opis, kolejnosc) VALUES('$tytul','$opis','$kolejnosc')
bigZbig
Cytat(art @ 2006-03-31 10:30:25)
znacznik jest unikalny wiec masz pewnosc ze kazde pole bedzie mialo inny numerek - wiekszy od poprzedniego

Jestes w bledzie

Po pierwsze istnieje (co prawda nikla) szansa, ze dwoch uzytkownikow w tym samym czasie bedzie usilowalo dodac wpis do tabeli

Po drugie znacznik czasu zalezy od zegara systemowego. Wystarczy zimowa lub letnia zmiana czasu i mozesz sie spotkac z problemem.

Poza tym jakiej dlugosci jest pole auto_increment a jakiej pole przechowujace znacznik czasu?
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.