Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Update Duplicate entry ....
Forum PHP.pl > Forum > Przedszkole
murasek
Witam,

Polecenie w bazie MySQL: Update shop_product set symbol=symbol+'0'

wyrzuca błąd: #1062 - Duplicate entry '0' for key 'shop_product_symbol'

Chcę zmienić indeksy (symbol) wszystkich artykułów z tabeli shop_product z 6 znakowych w systemie abk130 na 7 znakowe, czyli abk1300.
Pojawia się błąd jw.

Co powinienem zmienić w poleceniu?
Z góry dziękuję za pomoc.


Tomplus
Spróbuj tym zapytaniem
Kod
Update shop_product set symbol=CONCAT(symbol,'0');


Komunikat masz konkretny, pojawia ci się zapytanie gdzie chcesz powtórzyć unikalny symbol i prawdopodobnie posiadasz JUŻ - także np. abk1300.

Jak proponowałbym zrobić inaczej.

Stworzyć kolumnę symbol2 [ale nie unikalną] a następnie dopiero dodać to ZERO. Potem tylko zmienisz nazwy.
mmmmmmm
Cytat(Tomplus @ 8.05.2016, 08:00:08 ) *
Stworzyć kolumnę symbol2 [ale nie unikalną] a następnie dopiero dodać to ZERO. Potem tylko zmienisz nazwy.

Nie idź to drogą. Więcej problemów możesz sobie narobić...
Tomplus
Wszystko zależy od skomplikowania bazy i jak dużą ilość rekordów posiadamy.
Przy referencjach nie warto.

Pyton_000
Albo użyj

  1. UPDATE IGNORE shop_product SET symbol=symbol+'0'
murasek
Cytat(Pyton_000 @ 8.05.2016, 11:55:38 ) *
Albo użyj

  1. UPDATE IGNORE shop_product SET symbol=symbol+'0'


Obawiam się stwożyć dotakową kolumnę, więc skorzystałem z
  1. pobierz, plaintext
  2. UPDATE IGNORE shop_product SET symbol=symbol+'0'



Jednak zamiast dodać 0 do wszystkich wierszy kolumny symbol polecenie to zminiło tylko pierwszy wiersz w tej kolumnie na wartość 0.
Co z tym zrobić?

W kolumnie jest ok 7000 wierszy (indeksów artykułów).

Podobną operację (dodania 0 do indeksów artykułów) zrobiłem w systemie WF-MAG (baza SQL), ale to przez pomoc ASSECO (produceta).
Polecenie było trochę odmienne ze względu na specyfikację innych artykułów niż te w sklepie www. Wyglądało tak:
  1. pobierz, plaintext
  2. USE wapro.
  3.  
  4. Declare @idm numeric
  5.  
  6.  
  7.  
  8. SELECT @idm=0
  9.  
  10.  
  11. While 1=1
  12.  
  13. Begin
  14.  
  15. IF NOT EXISTS (SELECT 1 FROM magazyn WHERE id_magazynu>@idm)
  16.  
  17. Break
  18.  
  19. SELECT top 1 @idm=id_magazynu FROM magazyn WHERE id_magazynu>@idm ORDER BY id_magazynu
  20.  
  21.  
  22. UPDATE artykul SET indeks_katalogowy=indeks_katalogowy+'0' WHERE Id_magazynu=@idm AND len(indeks_katalogowy)=6 AND indeks_katalogowy+'0' NOT IN (SELECT indeks_katalogowy FROM artykul WHERE id_magazynu=@idm)
  23.  
  24. End



Może to coś naprowadzi ....

Cytat(Tomplus @ 8.05.2016, 08:00:08 ) *
Spróbuj tym zapytaniem
Kod
Update shop_product set symbol=CONCAT(symbol,'0');


Komunikat masz konkretny, pojawia ci się zapytanie gdzie chcesz powtórzyć unikalny symbol i prawdopodobnie posiadasz JUŻ - także np. abk1300.

Jak proponowałbym zrobić inaczej.

Stworzyć kolumnę symbol2 [ale nie unikalną] a następnie dopiero dodać to ZERO. Potem tylko zmienisz nazwy.


Baza ma ponad 7000 rekordów, więc rzeczywiście możliwe jest, że jest jakiś rekord 7 znakowy z 0, ale jak to można obejść bez tworzenia dodatkowej kolumny, czego się obawiam.

Cytat(mmmmmmm @ 8.05.2016, 09:20:56 ) *
Nie idź to drogą. Więcej problemów możesz sobie narobić...


Nie poszedłem smile.gif. Tylko co proponujesz?
com
no a próbowałeś użyć tego zapytania z concat?
Tomplus
Więc jak zmieniło ci na wartość 0 to oznacza że symbol = symbol + '0' nie działa, do operacji na stringach służy właśnie CONCAT.

A zanim użyjesz, możesz sprawdzić czy rekord o symbolu z dodatkowym zerem istnieje. Jeżeli istnieje to może należy przemyśleć co chcesz zrobić, bo być może powinny być dodane dwa zera. A może jakaś specjalna sekwencja znaków.
murasek
Cytat(Tomplus @ 8.05.2016, 17:12:38 ) *
Więc jak zmieniło ci na wartość 0 to oznacza że symbol = symbol + '0' nie działa, do operacji na stringach służy właśnie CONCAT.

A zanim użyjesz, możesz sprawdzić czy rekord o symbolu z dodatkowym zerem istnieje. Jeżeli istnieje to może należy przemyśleć co chcesz zrobić, bo być może powinny być dodane dwa zera. A może jakaś specjalna sekwencja znaków.


Dziękuję smile.gif CONCAT rozwiązało sprawę. Wcześniej źle zrozumiałem Twoją sugestię.
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.