🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.bazy-danych
13 messages
13 total messages Started by Borneq Wed, 11 May 2016 07:06
[SQL]Jak zastąpić wiersz tabeli?
#194946
Author: Borneq
Date: Wed, 11 May 2016 07:06
3 lines
1025 bytes
Insert nie działa gdy mamy w bazie już wiersz o tym samym kluczu 
głównym. Jeden sposób to delete i to z selectem istniejącego wiersza, a 
czy istnieje szybszy sposób zastąpienia?
Re: [SQL]Jak zastąpić wiersz tabeli?
#194947
Author: Adam Klobukowski
Date: Wed, 11 May 2016 07:14
8 lines
1747 bytes
W dniu środa, 11 maja 2016 09:06:24 UTC+2 użytkownik Borneq napisał:
> Insert nie działa gdy mamy w bazie już wiersz o tym samym kluczu 
> głównym. Jeden sposób to delete i to z selectem istniejącego wiersza, a 
> czy istnieje szybszy sposób zastąpienia?

Zależy od engine SQLowego. Przykładowo, MySQL posiada operację INSERT ...  ON DUPLICATE KEY UPDATE. W tych które takiej operacji nie mają, pozostaje (w transakcji) select a nastepnie insert lub update.

AdamK
Re: [SQL]Jak zastąpić wiersz tabeli?
#194949
Author: Tomek D
Date: Wed, 11 May 2016 08:22
11 lines
1198 bytes
W dniu 2016-05-11 o 09:06, Borneq pisze:
> Insert nie działa gdy mamy w bazie już wiersz o tym samym kluczu
> głównym. Jeden sposób to delete i to z selectem istniejącego wiersza,
> a czy istnieje szybszy sposób zastąpienia?

W zależności od serwera bazy danych
MERGE
UPDATE OR INSERT
albo inne

Tomek D.
Re: [SQL]Jak zastąpić wiersz tabeli?
#194948
Author: Wojtek Gapiński
Date: Wed, 11 May 2016 08:24
17 lines
1666 bytes
W dniu 11-05-2016 o 09:14, Adam Klobukowski pisze:
> W dniu środa, 11 maja 2016 09:06:24 UTC+2 użytkownik Borneq napisał:
>> Insert nie działa gdy mamy w bazie już wiersz o tym samym kluczu
>> głównym. Jeden sposób to delete i to z selectem istniejącego wiersza, a
>> czy istnieje szybszy sposób zastąpienia?
>
> Zależy od engine SQLowego. Przykładowo, MySQL posiada operację INSERT ...  ON DUPLICATE KEY UPDATE. W tych które takiej operacji nie mają, pozostaje (w transakcji) select a nastepnie insert lub update.
>
> AdamK
>


W MySQL jest jeszcze coś takiego jak REPLACE.

-- 
Wojtek Gapiński
http://www.jwmprojekt.pl
Re: [SQL]Jak zastąpić wiersz tabeli?
#194950
Author: szemrany
Date: Wed, 11 May 2016 08:29
16 lines
1728 bytes
On Wed, 11 May 2016 00:14:15 -0700 (PDT), Adam Klobukowski wrote:

>> Insert nie działa gdy mamy w bazie już wiersz o tym samym kluczu 
>> głównym. Jeden sposób to delete i to z selectem istniejącego wiersza, a 
>> czy istnieje szybszy sposób zastąpienia?
> 
> Zależy od engine SQLowego. Przykładowo, MySQL posiada operację INSERT ...  ON DUPLICATE KEY UPDATE. W tych które takiej operacji nie mają, pozostaje (w transakcji) select a nastepnie insert lub update.

Podobne mechanizmy posiada każdy sensowny serwer SQL. Szukaj po słowach
"insert or update" i/lub "upsert".

-- 
howgh
szemrany
"Zrozumienie umożliwia zastąpienie nieracjonalnych działań lub bezradności
przez działania racjonalne." M.Mazur, ojciec polskiej szkoły cybernetyki
Re: [SQL]Jak zastąpić wiersz tabeli?
#194951
Author: wloochacz
Date: Wed, 11 May 2016 18:23
24 lines
1880 bytes
W dniu 2016-05-11 o 10:22, Tomek D pisze:
> W dniu 2016-05-11 o 09:06, Borneq pisze:
>> Insert nie działa gdy mamy w bazie już wiersz o tym samym kluczu
>> głównym. Jeden sposób to delete i to z selectem istniejącego wiersza,
>> a czy istnieje szybszy sposób zastąpienia?
>
> W zależności od serwera bazy danych
> MERGE
> UPDATE OR INSERT
> albo inne
No to się Koledzy rozpisali...
A ja tam widzę, że Borneq nie wie co jak działa UPDATE.
Po prostu.
Przecież pisze wyraźnie o "zastąpieniu istniejącego wiersza" i ani słowa 
o tym, że chce go zastąpić lub dodać, jeśli zadany wiersz w tabeli nie 
istnieje. A przecież tak działa MERGE, UPSERT, INSERT OR UPDATE, itd...

A więc, aby zastąpić wiersz trzeba wykonać UDPATE czyli:
	UPDATE tabela
		set pole1 = wartosc
	where PolePK = WartoscKlucza

-- 
wloochacz
Re: [SQL]Jak zastąpić wiersz tabeli?
#194952
Author: Borneq
Date: Wed, 11 May 2016 18:44
9 lines
1332 bytes
W dniu 11.05.2016 o 20:23, wloochacz pisze:
> A więc, aby zastąpić wiersz trzeba wykonać UDPATE czyli:
>     UPDATE tabela
>         set pole1 = wartosc
>     where PolePK = WartoscKlucza

A jeśli nie wiem, czy dany wiersz istnieje? Najpierw wrzucam rekordy, 
potem wrzucam i niektóre mogą już istnieć - wtedy ma wykonać albo Insert 
albo Update.
Re: [SQL]Jak zastąpić wiersz tabeli?
#194953
Author: wloochacz
Date: Wed, 11 May 2016 20:37
24 lines
2062 bytes
W dniu 2016-05-11 o 20:44, Borneq pisze:
> W dniu 11.05.2016 o 20:23, wloochacz pisze:
>> A więc, aby zastąpić wiersz trzeba wykonać UDPATE czyli:
>>     UPDATE tabela
>>         set pole1 = wartosc
>>     where PolePK = WartoscKlucza
>
> A jeśli nie wiem, czy dany wiersz istnieje? Najpierw wrzucam rekordy,
> potem wrzucam i niektóre mogą już istnieć - wtedy ma wykonać albo Insert
> albo Update.
To wtedy naucz się poprawnie formułować pytania.
Czytam Twoje pytania od dawna, i wybacz, ale masz z tym problem.
Albo ja mało jakiś kumaty jestem - to też jest możliwe.

A co jeśli Twoja baza nie wspiera MERG, UPSERT, INSERT OR UPDATE?

to piszesz tak:
if exists(select * from tabela where ID = MojeID)
   update tabela set ... where ID = MojeID
else
   insert into tabela...

-- 
wloochacz
Re: [SQL]Jak zastąpić wiersz tabeli?
#194954
Author: Borneq
Date: Thu, 12 May 2016 04:38
15 lines
1731 bytes
W dniu 11.05.2016 o 22:37, wloochacz pisze:
> A co jeśli Twoja baza nie wspiera MERG, UPSERT, INSERT OR UPDATE?
>
> to piszesz tak:
> if exists(select * from tabela where ID = MojeID)
>   update tabela set ... where ID = MojeID
> else
>   insert into tabela...
>
Mam 100 milionów wierszy do wprowadzenia, czy to nie spowolni gdy przy 
każdym będzie select w porównaniu ze zwykłym insertem? I kod się 
duplikuje. Ale i tak przy insercie sprawdza czy istnieje, więc może nie.
A może użyć ON DUPLICATE KEY UPDATE tylko chciałbym na te same dane 
zrobić Update co wstawiam za pomocą Insert.
Dodaję ON DUPLICATE KEY UPDATE i jeszcze raz jakieś pole ustawiam.
Re: [SQL]Jak zastąpić wiersz tabeli?
#194955
Author: voy
Date: Thu, 12 May 2016 06:43
9 lines
1432 bytes
W dniu 2016-05-11 o 09:06, Borneq pisze:
> Insert nie działa gdy mamy w bazie już wiersz o tym samym kluczu
> głównym. Jeden sposób to delete i to z selectem istniejącego wiersza, a
> czy istnieje szybszy sposób zastąpienia?

Napisz jaka baza danych, będzie o wiele łatwiej?


Pozdr :)
Re: [SQL]Jak zastąpić wiersz tabeli?
#194956
Author: Borneq
Date: Thu, 12 May 2016 06:45
10 lines
1328 bytes
W dniu 12.05.2016 o 08:43, voy pisze:
> W dniu 2016-05-11 o 09:06, Borneq pisze:
>> Insert nie działa gdy mamy w bazie już wiersz o tym samym kluczu
>> głównym. Jeden sposób to delete i to z selectem istniejącego wiersza, a
>> czy istnieje szybszy sposób zastąpienia?
>
> Napisz jaka baza danych, będzie o wiele łatwiej?


Zdecydowałem się na mySQL pod Linuxem
Re: [SQL]Jak zastąpić wiersz tabeli?
#194957
Author: voy
Date: Thu, 12 May 2016 11:27
18 lines
1781 bytes
W dniu 2016-05-12 o 08:45, Borneq pisze:
> W dniu 12.05.2016 o 08:43, voy pisze:
>> W dniu 2016-05-11 o 09:06, Borneq pisze:
>>> Insert nie działa gdy mamy w bazie już wiersz o tym samym kluczu
>>> głównym. Jeden sposób to delete i to z selectem istniejącego wiersza, a
>>> czy istnieje szybszy sposób zastąpienia?
>>
>> Napisz jaka baza danych, będzie o wiele łatwiej?
>
>
> Zdecydowałem się na mySQL pod Linuxem
>

No to najlepiej "INSERT ... ON DUPLICATE KEY UPDATE",
plus możliwość wstawiania kilku wierszy w jednym zapytaniu.


Pozdr :)
Re: [SQL]Jak zastąpić wiersz tabeli?
#194958
Author: M.M.
Date: Thu, 12 May 2016 13:40
18 lines
2048 bytes
On Thursday, May 12, 2016 at 1:28:00 PM UTC+2, voy wrote:
> W dniu 2016-05-12 o 08:45, Borneq pisze:
> > W dniu 12.05.2016 o 08:43, voy pisze:
> >> W dniu 2016-05-11 o 09:06, Borneq pisze:
> >>> Insert nie działa gdy mamy w bazie już wiersz o tym samym kluczu
> >>> głównym. Jeden sposób to delete i to z selectem istniejącego wiersza, a
> >>> czy istnieje szybszy sposób zastąpienia?
> >>
> >> Napisz jaka baza danych, będzie o wiele łatwiej?
> >
> >
> > Zdecydowałem się na mySQL pod Linuxem
> >
> 
> No to najlepiej "INSERT ... ON DUPLICATE KEY UPDATE",
> plus możliwość wstawiania kilku wierszy w jednym zapytaniu.

Popieram.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads