ďťż
 
[mysql 4.0.24] INSERT do tabeli z automatyczną inkrementacją wartości pola. ďťż
 
[mysql 4.0.24] INSERT do tabeli z automatyczną inkrementacją wartości pola.
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

[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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    [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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • anette.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com