MySQL-ben sorok másolása

MySQL-ben sorok másolása
2012-01-05T10:58:49+01:00
2012-01-05T15:36:51+01:00
2022-11-24T06:35:37+01:00
dgyula
Sziasztok!

MySQL táblában szeretnék sorokat a táblán belül beszúrni és a régi sorokat meg updatelni. Mivel képek is vannak benne, nem szeretném hálózaton rángatni a kliens alkalmazásig ide-oda a tartalmát.
Pl.:
Eredeti sor:
sorszam nev kep regiadat stb
1 valami s+4d!% 0 piros
...

Másolás után így kellene kinéznie:
sorszam nev kep regiadat stb
1 valami s+4d!% 1 piros
...
13231 valami s+4d!% 0 zöld


Remélem érthető amit kérdezni szeretnék.

Ezt hogyan lehetne megoldani?
Az insert into kocsi where select * from kocsi where sorszam='1'; forma nem működik, bár ezt írták egy oldalon.
Mutasd a teljes hozzászólást!
Hát, ha meg tudsz győzni erről az egyéb okokról, akkor segítek, de most úgy látom, hogy nagy hibát akarsz csinálni.
Mutasd a teljes hozzászólást!

  • Írj egy stored procedure-t.
    Mutasd a teljes hozzászólást!
  • Ezzel próbálkoztam és ez mükszik is, csak a "regiadat" értékét nem tudom hogyan lehet így módosítani:

    insert into kocsi (nev,kep,regiadat,stb) (select nev,kep,regiadat,stb from kocsi where sorszam='1');

    Hogyan lehet a regiadat értékét eközben megadni?
    Mutasd a teljes hozzászólást!
  • Az SP-ben először lemented egy select-tel a régiadat változó értékét, majd megadod az insertnek.
    Mutasd a teljes hozzászólást!
  • Egy példát tudnál írni rá? Mi az az SP pl?
    Mutasd a teljes hozzászólást!
  • SP értsd stored procedure. Példának pedig a következő linket ajánlanám: link
    Mutasd a teljes hozzászólást!
  • Hát ezt nem nagyon értem. A regiadat régi értéke nem érdekes, az új értéke fixen megvan (pl 0), a régi adat marad a helyén, ott majd egy update-val átírom pl 1-re a regiadat rekordot. Viszont amikor az új sort beszúrom a régi adatokkal, akkor beszúrás közben más rekordokat átírnék más tartalomra (pl. az stb értékét). Viszont ha jól értem a példát amit küldtél ehhez a DECLARE valaminev INT DEFAULT 0 (vagy 0 helyett bármi más default érték) sorral létrehozok egy változót, amit aztán tetszőlegesen tudok elhelyezni majd az sql parancsban - szintaktikának megfelelően. De nekem nem ez kell, hanem valahogy az insert utasításban még megadni hogy adott rekordoknak mi legyen a tartalmuk, míg a többi rekordba a minta sorból (azaz az eredeti rekordokból) vegye az értékeket. Tudom hogy nem jó, de valami ilyesmi kellene nekem:

    insert into tabla (nev,utca,telefon,email) ((select nev,utca,telefon from tabla where sorszam=1),'valami@valahol.hu');

    Erre kellene nekem valami konkrét példa.
    Mutasd a teljes hozzászólást!
  • Eleve az általad írt insert into is hibás.

    insert into tabla (nev,utca,telefon,email)VALUES ((select nev,utca,telefon from tabla where sorszam=1),'valami@valahol.hu');

    Másrészt:

    Ha letisztáznád, hogy mit is szeretnéd akkor mostmár pontosan egyszerűbb lenne segíteni. Értsd: Egyszer fontos a régiadat, egyszer nem.
    Mutasd a teljes hozzászólást!
  • Nem írta el, a VALUES szó nem kell, ha select-ből töltöd fel az adatokat
    Mutasd a teljes hozzászólást!
  • Így tudod megcsinálni:

    insert into tabla (nev,utca,telefon,email) select nev,utca,telefon,'valami@valahol.hu' from tabla where sorszam=1;
    Mutasd a teljes hozzászólást!
  • Sajnos a values-el sem jó. Amit hibaként kiír:
    ERROR 1241 (21000): Operand should contain 1 column(s)

    Képzelj el egy táblát, amiben adatok vannak amik értelem szerüen módosúlhatnak. Viszont a módosításoknak a nyomát (azaz az eredeti adatokat) is el szeretném tárolni. A már nem aktuális (tehát régi) adatokat megjelölöm úgy, hogy a "regiadat" rekordban a 0 értéket 1-re cserélem. Mivel az eredeti adatokat tartalmazó sor már a táblában van, így ismerem annak a sorszámát, tehát az update metódussal könnyen át tudom benne írni a "regiadat" rekord tartalmát. Viszont az új sor még nincs benne - mivel most másolnám bele úgy, hogy az eredeti, most már régi adatnak minősülő sort bemásolom -, így nem tudom az új sornak semmilyen azonosítóját. A táblában közben mások is belepiszkálhatnak ezalatt. Tehát ezért gondoltam arra, hogy 1 tranzakcióban beszúrnám az új sort a régi adatokkal úgy, hogy közben bizonyos rekordok tartalmát nem a régi adatokkal töltöm fel, hanem új tartalommal. Persze azt is megcsinálhatnám, hogy az új adatokkal beszúrok egy új sort, majd a LAST_INSERT_ID()-vel lekérem a sorszamát, majd az adott sor adott rekordjait updatelem a régi sor adott rekordjaival, de gondoltam erőforrás takarékosabb, ha ezt 1 tranzakcióban csinálom meg, meg ha jól tudom a LAST_INSERT_ID() nem feltétlen ad pontos eredményt ha közben más is beszúrt a táblába egy sort. Remélem így már érthetőbb mit szeretnék. Valójában nekem az a megoldás kellene amit írtam és amire írtad hogy a values hiányzik, csak nem tudom miért nem mükszik. Azért írtam 2 féle mezőnevekkel példát, hogy megpróbáljam megvilágosítani a problémát, de ezek szerint nem sikerült.
    Mutasd a teljes hozzászólást!
  • Úgy látom Te egy un. log táblát akarsz készíteni.
    Ezt több féle képpen is meg lehet oldani.
    Az egyik módszer, hogy készítesz egy másik ugyanolyan szerkezetű táblát, csak mondjuk az átláthatóság kedvéért a neve elé teszel egy log előtagot.
    Pl: tabla1 az eredeti tábla és log_tabla1 a log tálba.
    A log táblát pedig INSERT, UPDATE és DELETE triggerekkel töltöd.
    A triggerekről itt találsz leírást.
    Mutasd a teljes hozzászólást!
  • Én ezt egy táblában szeretném megoldani - egyéb okokból. A hibás kódom nem lehet valahogy átírni hogy működjön? (A módositandó rekordok változnak, tehát hol. pl. az autó színét, hol pedig a tipusát kell módosítani.)
    Mutasd a teljes hozzászólást!
  • Hát, ha meg tudsz győzni erről az egyéb okokról, akkor segítek, de most úgy látom, hogy nagy hibát akarsz csinálni.
    Mutasd a teljes hozzászólást!
  • Delphiben kezelem a táblát. A program pedig kronológikus sorrenben megmutatja a változásokat, amikre aztán szűrni is lehet. Sok adat nem lesz benne soha, max talán ha 100-200 sor gyűlik majd össze. Viszont vannak benne nagyméretű képek is. És mindezt távolról is el kell érni. Ezért nem jó a 2 tábla nekem és szeretném már az sql szerveren elintézni a tranzakciókat.

    Viszont nem láttam amit írtál, hogy hogyan javítsam. És így már megy.

    Köszönöm a segítséget, megy a pont.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd