Tack för svar, ska försöka besvara er och förklara mig så gott det går.
Skrivet av nadirian:
Du skulle nog kunna ta bort allt med ”and not exists”, vet inte riktigt vad för syfte den har?
Du har ju redan filtrerat ut alla du vill ändra på i din WHERE-sats.
"and not exists" är där för att inte krocka med rows som redan ligger där, WHERE är bara där för att inte röra rows som saknar prefixen (find_text).
Skrivet av nadirian:
En update gör som den säger, uppdaterar. Den skapar inga dubbletter . Den uppdaterar ju bara befintligt där den träffar.
Dubbletterna är ju redan där, det är det som skapat detta problem
Skrivet av nadirian:
Om du är rädd för att ändra data som du inte vill ändra, kan di förstås backuppa. Men annars kan du i en fråga hämta ut IDna för de rader du vill ändra . Typ ”select id from table where filtered like ’%findme%’”
Och sen tar du de IDna och trycker in i din where i replace satsen.
”Update table set foo=replace(…) where id in (dina idn här )”
Men det översta borde räcka för dig om jag förstår din fråga rätt 🙂
Jag förstår nog inte riktigt hur detta kommando ska fungera, jag försökte här men jag missförstår nog vad exakt jag ska skriva in.
gallerydl=# select entry from mangadex where entry '%mangadex%';
ERROR: type "entry" does not exist
LINE 1: select entry from mangadex where entry '%mangadex%';
Jag har alltså en table som heter "mangadex", i den finns en column som heter entry där cirka hälften är dubbletter med prefixen "mangadex".
Skrivet av Sinery:
Problemet verkar ju vara att WHERE %find_text% ger falska positiva
Förslår du postar en bild
Om det är en prefix kör WHERE YourColumn LIKE 'find_text%' dvs bara 1 %
Bild på vad, datan?
Så ser det ut vid "skiftet" till de nya utan prefix (som det ska vara).
Om du menar hur det blir om jag bara försöker köra utan NOT EXISTS etc:
gallerydl=# UPDATE "mangadex"
SET entry = REPLACE(entry, 'mangadex', '')
WHERE
entry LIKE 'mangadex%';
ERROR: duplicate key value violates unique constraint "idx_16562_sqlite_autoindex_mangadex_1"
DETAIL: Key (entry)=(35179607-27ce-4f1f-b72e-8e3fcb61f97f_3) already exists.
Så blir det då. Att den nämner sqlite är pga all gammal data är importerad från sqlite
Bra idé med "find_text%'"
Skrivet av KAD:
Det är svårt att förstå vad du menar utan att se data. Dörför blir det gissningar.
Jag tippar på att din WHERE NOT EXISTS är felformulerad. Du vill att den ska låta bli att ändra på de rader där du redan lagt till eller tagit bort ett ”prefix”, oklart vilket alternativ och oklart hur prefixet ser ut.
Men det den gör är att låta bli att agera i de tabeller där det finns någon rad alls där du redan gjort manövern. Om du har en vettig primary key[1] i tabellen, så väljer du att matcha på den också som extra villkor. Det är svårt/omöjligt att föreslå en konkret lösning utan att se tabelldefinition och helst också exempeldata.
Att du ens har problemet tyder på att databasen är feldesignad i betydelsen låg normaliseringsgrad. Återigen är det svårt att säga något bestämt, men texten bör antagligen ligga i en egen tabell och de andra tabellerna borde referera till den. Då hade ändringen inneburit att ändra en enda rad i en enda tabell. DRY.
[1] Nästan alltid är det bästa valet att låta PK vara en rent teknisk nyckel, ett auto-incrementat id-fält av ett stort heltal, alternativt en UUID/GUID, dvs i praktiken ett 128-bitars slumptal.
Jag har lagt till en bild på hur datan ser ut ovanför, hoppas det är till någon nytta. prefixen är alltid samma som vad table't själv heter:
I just denna table så fungerar mitt första exempel utmärkt och den uppdaterar alla 7.
Att databasen är feldesignad är antagligen inte helt inkorrekt, jag har använt pgloader för att importera all data från .sqlite-filer in i postgresql, men glömde ändra hur den ser ut då mjukvaran som använder databasen verkar ändrat hur den vill den ska se ut.
Exakt hur importen gjordes:
for f in ./*.sqlite3; do pgloader $f pgsql://gallerydl:gallerydl@localhost/gallerydl; done