Autor Téma: "Krížový" update tabuľky  (Přečteno 1136 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4426
  • Karma: 39
    • Verze Delphi: XE7 professional
"Krížový" update tabuľky
« kdy: 01-02-2016, 13:57:36 »
Potrebujem vykonať "krížový" update tabuľky.
To znamená navzájom vymeniť hodnoty FK IDLandlord_Flat. Rádovo ide aj o niekoľko tisíc riadkov v jednom príkaze.
Mám nastavenú doménu FOREIGNKEY kde mám:
  not null
  check: value > 0
Kód: [Vybrat]
'update DEPOSITS set IDLandlord_Flat = :ID1 where (IDLandlord_Flat = :ID2) and (Period >= :Period)'
 'update DEPOSITS set IDLandlord_Flat = :ID2 where (IDLandlord_Flat = :ID1) and (Period >= :Period)'
Prvým príkazom update budem mať dvojnásobný počet riadkov s hodnotou IDLandlord_Flat = ID2 a druhým príkazom zmením hodnotu ID2 na ID1, čo je nežiaduci výsledok.

Mňa nenapadlo žiadne rozumné riešenie.
Po hľadaní som našiel:
 
1) Firebird Book2 Edition Borrie Helen str. 240 - Vytvoriť dočasný stĺpec, doň si uložiť pôvodné hodnoty a to využiť. Po ukončení akcie stĺpec zrušiť. Neviem ako rýchle to bude vzhľadom na to, že tabuľka môže mať časom aj milióny riadkov.

2) Možno by išlo použiť old.hodnota či new.hodnota, ale o tých neviem nič. Ako sa správajú.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1432
  • Karma: 34
    • Pepak.net
Re:"Krížový" update tabuľky
« Odpověď #1 kdy: 02-02-2016, 07:32:20 »
V první řadě se zamysli nad tím, jestli takovou operaci fakt potřebuješ. Mě to připadá krajně podezřelé - dovedu si představit, proč bys mohl chtít přesunout položky mezi majiteli, ale ne prohodit. Jaký to má real-world smysl?

Jinak by to šlo udělat takhle:
Kód: SQL [Vybrat]
  1. UPDATE deposits
  2. SET IDLandlord_Flat = CASE IDLandlord_Flat
  3.   WHEN :ID1 THEN :ID2
  4.   WHEN :ID2 THEN :ID1
  5.   ELSE IDLandlord_Flat
  6.   END
  7. WHERE IDLandlord_Flat IN (:ID1, :ID2) AND Period>=:Period
Ale než to uděláš, fakt si odpověz, jestli je to rozumné. Divil bych se, kdyby bylo.

Jinak zvaž také pojmenovávání sloupců. Několikrát jsem si málem zlomil prsty, jak jsem psal ty nekonzistentní názvy. Normální je použít buď IDLandlordFlat, nebo ID_Landlord_Flat, ale IDLandlord_Flat, to je hrůza!!!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4426
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:"Krížový" update tabuľky
« Odpověď #2 kdy: 02-02-2016, 09:15:17 »
Citace
V první řadě se zamysli nad tím, jestli takovou operaci fakt potřebuješ.
Vždy ma odhalíš ;D  Trochu som pozabudol na skutočnosť, že vytváram nové IDLandlord_Flat. Takže to nepotrebujem.
Príspevok sa už vymazať nedal a zaujíma ma to aj z princípu.

Ďakujem.
Citace
Normální je použít buď IDLandlordFlat, nebo ID_Landlord_Flat, ale IDLandlord_Flat, to je hrůza!!!
Názov tabuľky Landlord_Flat tým podtržníkom vyjadruje, že sa jedná o väzobnú tabuľku pre M:N. Aby to udrelo do očí. Primárny kľúč pomenúvam ID+názov tabuľky. Mám tam mať správne FK Landlord_Flat, keďže sa jedná o cudzí kľúč.
« Poslední změna: 02-02-2016, 09:17:00 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.