[mysql 4.0.24] INSERT do tabeli z automatyczną inkrementacją wartości pola.
Godless - 20-11-2005 18:48
[mysql 4.0.24] INSERT do tabeli z automatyczną inkrementacją wartości pola.
Witam,
Mam tabelę, w której kluczem głównym są dwa pola: pole typu DATE i pole typu INT. Chciałbym przechowywać rekordy różnicując je w sposób:
date id pozostałe pola -------------------------------------- 2005-11-20 1 wartości 2005-11-20 2 wartości 2005-11-20 3 wartości 2005-11-21 1 wartości 2005-11-21 2 wartości itd.
Moje pytanie brzmi, czy jest możliwe, aby przy INSERT wstawić "od razu" zinkrementowaną wartość id (taką którą otrzymałbym w SELECT MAX(id)+1 FROM tabela WHERE date = "2005-11-21";), czy może lepiej zrobić LOCK'a, potem wspomniany SELECT, potem właściwy INSERT i ostatecznie UNLOCK?
Pozdrawiam, -- Godless godless@vp.pl
Wojtek pBT (lapt) - 23-11-2005 11:03
Dnia 2005-11-20 16:30, Użytkownik Godless napisał:
[ciach] > > Moje pytanie brzmi, czy jest możliwe, aby przy INSERT wstawić "od razu" > zinkrementowaną wartość id (taką którą otrzymałbym w SELECT > MAX(id)+1 FROM tabela WHERE date = "2005-11-21";), czy może lepiej
INSERT INTO tab (date, id, pola) SELECT NOW(), MAX(id)+1, 'pola' FROM tab WHERE date = NOW();
Przy czym musisz jeszcze obsłużyć brak rekordów dla zadanej daty, co wcale nie jest trywialne w SQL. Natomiast łatwiej bedzie sprawdzić ilość rekordów dodanych (w PHP będzie to zdaje sie mysql_affected_rows() ) i jeżeli jest 0, to dodać w sposób: INSERT INTO tab VALUES (NOW(),1,'pola');
pozdro, pBT
Godless - 23-11-2005 11:04
Dnia Sun, 20 Nov 2005 23:54:13 +0100, Wojtek pBT (lapt) napisał(a):
> INSERT INTO tab (date, id, pola) > SELECT NOW(), MAX(id)+1, 'pola' FROM tab WHERE date = NOW(); > > Przy czym musisz jeszcze obsłużyć brak rekordów dla zadanej daty, co > wcale nie jest trywialne w SQL.
Jest ;) IFNULL :)
Popełniłem następujące zapytanie:
INSERT INTO tabela (date, id, pole1, pole2, pole3) SELECT CURRENT_DATE, IFNULL(MAX(id),0)+1, 'wartoscpola1', 'wartoscpola2', 'wartoscpola2' FROM tabela WHERE date = CURRENT_DATE;
Działa to dokładnie tak, jak chciałem. Dziękuję za pomoc :)
-- Godless godless@vp.pl
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[mysql] =?ISO-8859-2?Q?Za=E6mienie=2E=2E=2E_jak_wy=B6wietli=E6?==?ISO-8859-2?Q?=2E=2E=2E?=
[mysql] =?ISO-8859-2?Q?wielko=B6=E6_bazy_a_stabilno=B6=E6=2C?==?ISO-8859-2?Q?_podzia=B3_du=BFej_bazy_a_powi=B1zania_tabel?=
[MySQL] =?ISO-8859-2?Q?Wy=B6wietlenie_kolejnej_pozycji=2C_?==?ISO-8859-2?Q?jak=B1_mia=B3by_dany_rekord=2C_gdybym_czyta=B3 _?==?ISO-8859-2?Q?wg_konkretnych_kryteri=F3w=2E_Da_si=EA_=3F?=
[mysql 4.0.x] przenoszenie kolum =?ISO-8859-2?Q?mi=EAdzy_bazam?==?ISO-8859-2?Q?i_cd_=2E=2E=2E_?=
Gdzie MySQL 4.1, a gdzie 5.0?
[MySQL 4.0...4.1] zabezpieczenie przed =?ISO-8859-2?Q?jednoczesn?==?ISO-8859-2?Q?=B1_edycj=B1?=
[MS SQL] "set names" (mySQL) w MS SQL
[mysql 5.x] jak =?ISO-8859-2?Q?zrealizowa=E6_zapytanie=3F_cz?==?ISO-8859-2?Q?yli_podzapytanie_i_wi=EAcej_ni=BF_jeden_rz=B1? ==?ISO-8859-2?Q?d_wynik=F3w?=
[MySQL] Czy da =?ISO-8859-2?Q?si=EA_wykonac_takie_powi=B1z?==?ISO-8859-2?Q?anie_mi=EAdzy_tabelami=2C_i_jak_to_odpyta=E6_? ==?ISO-8859-2?Q?=3F?=
Import za =?ISO-8859-2?Q?pomoc=B1_EMS_Data_Import_for_?==?ISO-8859-2?Q?MySQL_-_polskie_litery=2E?=
zanotowane.pldoc.pisz.plpdf.pisz.planette.xlx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|