Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dodawanie rekordu z wartością o jeden większą niż poprzednia
Forum PHP.pl > Forum > Bazy danych > MySQL
thomson89
Witam!

Potrzebuję wstawić do bazy danych rekordy, w których jedną z wartości będzie wartość poprzedniego rekordu tej kolumny powiększona o 1. Próbowałem tak:
[MYSQL] pobierz, plaintext
[MYSQL] pobierz, plaintext

Kod
INSERT INTO `podstrony` (tytul, nazwa, tekst, kol) VALUES ('tytul', 'nazwa', 'tekst', MAX(`kol`) + 1)


Ale niestety nie działa. Proszę o pomoc!

Pozdrawiam!

PS: Nie działają tagi mysql, dlatego wstawiłem w code.
thek
A to nie prościej tej kolumnie nadać atrybut autoincrement i olać sprawę? winksmiley.jpg
wookieb
A nie lepiej użyć własciwości o nazwie "auto inkrementowanie" (autoincrement) w MySQL?
Załóż klucz na tą kolumnę o nazwie "kol" oraz wykonaj poniższe zapytanie w bazie MySQL
  1. ALTER TABLE `tee` CHANGE `id` `id` INT( 11 ) NOT NULL AUTO_INCREMENT

Wykorzystanie MySQL pozwoli ci na automatyczne numerowanie kolumn przy dodawaniu każdego rekordu. Oznacza to, że jeżeli nie podasz wartości dla kolumny o nazwie "KOL" w zapytaniu insert zostanie tam wstawiony kolejny numer z właściwości "auto inkrementowanie".


P.s. Tak ten post miał być ironiczny @THEK.

A tak na serio to pewnie wartość kol może się powtarzać w całej tabeli?
thomson89
A jak się zachowa auto_increment jak będę zmieniał te wartości?
erix
A jak miałby się zachować?

Z tego, co pamiętam, to auto_increment generuje wartość dla nowego rekordu korzystając z formuły:
  1. MAX(klucz_glowny)+1
wookieb
Nie zmienia się tak łatwo.
Przykładowo dodasz 100 rekordów , usuniesz 99 to kolejny rekord będzie mieć numer 101.
Pewnie nie o to Ci chodzi?

@THEK mode
@Erixie niestety tak nie jest, wartość auto_increment jest przechowywane dla każdej tabeli oddzielnie, tak więc przypomnę, że przykładowo dodasz 100 rekordów , usuniesz 99 to kolejny rekord będzie mieć numer 101.
W tabeli może być jedno pole z opcją "autoincrement" i dodatkowo na pole to musi zostać założony klucz (czyli taki spis treści dla bazy danych, który bardzo się przydaje w wielu zapytaniach chociażby wyszukiwanie rekordu po tym polu)
END @THEK mode

thomson89
To tak nie może być. Wartości muszą być kolejne. Na podstawie tego będzie menu robione.
Kod
ID - Pole 1 - Pole 2 - kol
1 -- tektst -- tekst -- 1
2 -- tekst --- tekst -- 2

lub
Kod
ID - Pole 1 - Pole 2 - kol
1 -- tektst -- tekst -- 2
2 -- tekst --- tekst -- 1

Jak dodam następny powinno być kol 3. A jak usunę ID 1, to id 2 powinno mieć kol 1 (to se zrobię). Z tego co mówi wookieb, wtedy następny kol będzie o wartości 3. Czyli przeskoczy o jedno. Auto_increment nie pasuje do tego zupełnie.
Kod
ID - Pole 1 - Pole 2 - kol
2 -- tekst --- tekst -- 1
3 -- tekst --- tekst -- 3
wookieb
  1. SELECT @wartosc_pola := MAX(pole) FROM tee;
  2. INSERT INTO tee (pole) VALUES ( IF(@wartosc_pola IS NULL, 0, @wartosc_pola) + 1 )


P.s. Thek nie rób mi teraz wszystkich możliwych permutacji tych zapytań.
erix
~wookieb - fakt, ale skądś ta wartość do zapisu musi być wzięta. winksmiley.jpg

I odczep się od ~thek. tongue.gif
thomson89
O takie coś mi chodziło. Dzięki!
thek
Mam pytanie do thomsona... O co Ci chodzi w zdaniu "A jak się zachowa auto_increment jak będę zmieniał te wartości?". O to, że chciałbyś wartości tych pól ręcznie modyfikować? Jeśli tak to weź pod uwagę własności klucza. Modyfikować te wartości możesz jak najbardziej, ale pewne ograniczenie masz. Zazwyczaj autoincrement jest primary lub unique, wiec nie założysz klucza o id już istniejącym w bazie choćby. Z tego co kojarzę to wartość autoincrement jest przechowywana w bazie i wskazuje na liczbę większa o jeden od ostatnio wstawionego rekordu (wstawionego... nie zmodyfikowanego). Szczerze to nigdy nie sprawdzałem co się stanie jeśli przykładowo mamy 100 rekordów, a więc autoincrement ma 101, my przykładowo rekord o id=90 ustawimy na 105 i wstawimy kolejno 10 rekordów. Nie testowałem jak baza zachowa się przy owym 105. Czy go zignoruje i po 104 wstawi 106, czy może wywali błąd próbując wstawić coś na 105. Jeśli chciałbyś bez luk, to z tego co co już kiedyś nawet tutaj poruszano, musiałbyś zrobić własną funkcję modyfikująca te klucze i związane z nimi powiązania. A to może być dla bazy zabójcze.

Wookieb... Poza tym Twój przykład jest skuteczny tylko przy usuwaniu rekordu ostatniego i tylko dla niego ma sens. usunięcie id ze środka nie sprawi, że luka ta magicznie się sama załata. Choć sam indeks w tym miejscu jest pusty i dowolny wpis, który mógłby by jako autoincrement śmiało mógłby w tę lukę wskoczyć. Ale wymagało by to:
a) zapamiętanie autoincrement
cool.gif wyszukanie luki
c) jeśli jest luka wrzucamy rekord pod jej id i ustawiamy autoincrement na zapamiętany (baza będzie chciała na pałę go zwiększyć przy insert)
d) jeśli nie ma luki to robimy zwykły insert bez modyfikacji autoincrement po nim.
thomson89
Ja, przy usuwaniu będę musiał obniżyć kol każdego powyższego o 1. Na szczęście takich rekordów będzie maks. 20. Tak samo przy sortowaniu, będę musiał jednym rekordom zmniejszać kol a drugim zwiększać.

No właśnie chodziło mi o zachowanie auto_incrementa przy modyfikowaniu tych kluczy. W tej tabelce już mam jedno auto_increment.
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.