Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL] Replace - Zmieniający się identyfikator
Forum PHP.pl > Forum > Bazy danych > MySQL
starach
Witam. Mam drobny problem z identyfikatorem auto_increment.
Cytat
CREATE TABLE `session` (
`s_id` int(11) NOT NULL auto_increment,
`s_phpsid` varchar(255) NOT NULL,
`s_data` text NOT NULL,
`s_start` datetime NOT NULL,
`s_update` datetime NOT NULL,
PRIMARY KEY (`s_id`),
UNIQUE KEY `s_phpsid` (`s_phpsid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Wykonując zapytanie
  1. REPLACE INTO `session`(s_phpsid,s_data,s_start,s_update) VALUES('a20e36dd6654df5ea30ca626635fb141', 'a:0:{}', '2008-07-04 20:07:35', NOW())
Nawet jeśli tylko podmienia wartości to i tak podnosi s_id o jeden.
Co zrobić aby przy podmianie wpisywał zawsze tą samą wartość kolumny s_id ?
nospor
tak dziala replace - kasuje stary rekord, wklada nastepny. a skoro wklada nastepny to nadaje mu kolejny ID.

Powinienes uzyc insert into.... on duplicate key update
http://dev.mysql.com/doc/refman/5.0/en/ins...-duplicate.html
Kicok
s_id jest zbędne w tej tabeli. Daj PRIMARY KEY na s_phpsid i ustaw mu typ danych na CHAR(32).
Rozwiąże to przy okazji twoje problemy z REPLACE
starach
W sumie racje że zbędne miałem inna koncepcje wcześniej a przy jej zmianie zapomniałem wywalić s_id.
Dzięki wielkie jeszcze dwa pytania.
nospor: Czy ON DUPLICATE jest standardem SQL czy tylko działa na MySQL'u ?
Kicok: Jest jakaś szczególna różnica między VARCHAR(32) i CHAR(32) ?
nospor
Cytat
nospor: Czy ON DUPLICATE jest standardem SQL czy tylko działa na MySQL'u ?

nie wiem, nie kojarze by bylo np. w oraclu, ale duzo oracla nie uzywalem to moze przegapilem

Cytat
Kicok: Jest jakaś szczególna różnica między VARCHAR(32) i CHAR(32) ?
pole typu char(32) zawsze bedzie zajmowalo 32 znaki, niezaleznie czy jest tam napis 'ala' czy 'ala ma kota i inne znaki do 32'.
varchar(32) bedzie zajmowalo tyle bajtow ile ma znakow tekst w polu.

Pamietaj ze jesli uzywasz char w tabeli, gdzie jest tez varchar, to char i tak bedzie traktowane jako varchar.
Ajdacho
Jeżeli masz dużo miejsca na bazę danych to używaj char zamiast varchar. Baza będzie o wiele szybciej chodziła i będzie bardziej odporna na zepsucie. Wynika to że przy charze każda zmienna zajmuje określone stałe bity na dysku i baza szybciej potrafi taką zmienną znaleść. No i fragmentacja danych przy char jest o wiele mniejsze.

Pozdrawiam
Kicok
Cytat
Pamietaj ze jesli uzywasz char w tabeli, gdzie jest tez varchar, to char i tak bedzie traktowane jako varchar.


Fakt. W tym przypadku jest kolumna typu TEXT, która również ma zmienną długość. Więc wzrostu wydajności w związku z używaniem CHAR(32) nie będzie, ale zaoszczędzisz cały 1 bajt pamięci na wiersz danych ;]
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.