เดธเต€เดฑเต‹ เดกเตŒเตบเดŸเตˆเด‚ เดตเดฟเดจเตเดฏเดพเดธเดตเตเด‚ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเตเด•เดณเตเด‚

เดธเต€เดฑเต‹ เดกเตŒเตบเดŸเตˆเด‚ เดตเดฟเดจเตเดฏเดพเดธเดตเตเด‚ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเตเด•เดณเตเด‚

เดตเดฟเดจเตเดฏเดพเดธเดคเตเดคเดฟเดฒเต† เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เด…เดจเตเดฏเต‹เดœเตเดฏเดค เดชเตเดฐเดถเตเดจเด™เตเด™เตพ เดŽเด™เตเด™เดจเต† เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เดพเดฎเต†เดจเตเดจเต เดˆ เดฒเต‡เด–เดจเด‚ เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เดชเตเดฐเดพเดฅเดฎเดฟเด• เดคเดฏเตเดฏเดพเดฑเต†เดŸเตเดชเตเดชเดฟเดฒเตเดฒเดพเดคเต† เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เตพ เดถเตเดฐเดฎเดฟเด•เตเด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ เดจเดฟเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเตŠเดกเด•เตเดทเตป เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพเด•เตเด•เต เดŽเดจเตเดคเต เดธเด‚เดญเดตเดฟเด•เตเด•เตเดฎเต†เดจเตเดจเต เดžเด™เตเด™เตพ เดจเดฟเด™เตเด™เดณเต‹เดŸเต เดชเดฑเดฏเตเด‚. เดชเต‚เดœเตเดฏเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเด•เดพเตป เด†เดตเดถเตเดฏเดฎเดพเดฏ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดฒเตˆเดซเต เดธเตˆเด•เตเด•เดฟเตพ เด˜เดŸเตเดŸเด™เตเด™เดณเดฟเดฒเต‚เดŸเต† เดžเด™เตเด™เตพ เด•เดŸเดจเตเดจเตเดชเต‹เด•เตเด‚ (เดเด•เดฆเต‡เดถเด‚. เดชเดพเดค: เด•เต‚เดŸเตเดคเตฝ - เดชเต‚เดœเตเดฏเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเดฏ เดธเดฎเดฏเด‚). เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เดณเตเดŸเต† เดซเดฒเด‚, เดฌเดพเด•เตเด•เตเดตเต‡เตผเดกเต-เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดพเดฏ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดฎเดพเดฑเตเดฑเด‚ เด’เดฐเต เดชเดฟเดจเตเดจเดฟเดฒเต‡เด•เตเด•เต-เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดพเดฏ เดฐเต€เดคเดฟเดฏเดฟเตฝ เดชเตเดฐเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚.

เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เด•เต‹เดกเต เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เตพ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฎเดจเดธเดฟเดฒเดพเด•เตเด•เดฃเดฎเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด…เดต เด‡เดตเดฟเดŸเต† เด•เดฃเตเดŸเต†เดคเตเดคเดพเด‚ เดธเดพเดฎเต‚เดนเดฟเด•เด‚.

เด†เดฎเตเด–เด‚

เดชเต‚เดœเตเดฏเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเดฏ เดตเดฟเดจเตเดฏเดพเดธเด‚

เดŽเดจเตเดคเตŠเดฐเต เดจเดฟเด—เต‚เดขเดค เดชเต‚เดœเตเดฏเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเดฏ เดตเดฟเดจเตเดฏเดพเดธเด‚? เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตปเตเดฑเต† เด’เดฐเต เดชเตเดคเดฟเดฏ เดชเดคเดฟเดชเตเดชเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดตเดฟเดœเดฏเด•เดฐเดฎเดพเดฏเดฟ เด…เดตเดคเดฐเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเดจเตเดจ เดคเดฐเดคเตเดคเดฟเตฝ เดจเดฟเด™เตเด™เดณเตเดŸเต† เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‡เดคเต เดชเดฑเดฏเดพเด‚, เด…เดคเต‡เดธเดฎเดฏเด‚ เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเต เด…เดคเดฟเตปเตเดฑเต† เดฒเดญเตเดฏเดค เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ. เด’เดฐเต เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเดฟเตปเตเดฑเต†เดฏเตเด‚ เด•เดฎเตเดชเดจเดฟเดฏเตเดŸเต†เดฏเตเด‚ เดตเต€เด•เตเดทเดฃเด•เต‹เดฃเดฟเตฝ, เด‡เดคเต เดธเดพเดงเตเดฏเดฎเดพเดฏ เดเดฑเตเดฑเดตเตเด‚ เดฎเดฟเด•เดšเตเดš เดตเดฟเดจเตเดฏเดพเดธ เดธเดพเดนเดšเดฐเตเดฏเดฎเดพเดฃเต, เด•เดพเดฐเดฃเด‚ เด‡เดคเต เดชเตเดคเดฟเดฏ เดธเดตเดฟเดถเต‡เดทเดคเด•เตพ เด…เดตเดคเดฐเดฟเดชเตเดชเดฟเด•เตเด•เดพเดจเตเด‚ เดฌเด—เตเด•เตพ เดคเดŸเดธเตเดธเดฎเดฟเดฒเตเดฒเดพเดคเต† เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เดพเดจเตเด‚ เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต.

เด‡เดคเต เดŽเด™เตเด™เดจเต† เดจเต‡เดŸเดพเด‚? เดจเดฟเดฐเดตเดงเดฟ เดฎเดพเตผเด—เด™เตเด™เดณเตเดฃเตเดŸเต, เด…เดตเดฏเดฟเดฒเตŠเดจเตเดจเต เด‡เดคเดพ:

  • เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเต‡เดตเดจเดคเตเดคเดฟเตปเตเดฑเต† เดชเดคเดฟเดชเตเดชเต เดจเดฎเตเดชเตผ 1 เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเด•
  • เด’เดฐเต เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดฎเตˆเด—เตเดฐเต‡เดทเตป เดจเดŸเดคเตเดคเตเด•
  • เดชเดคเดฟเดชเตเดชเต #2 เดจเต เดธเดฎเดพเดจเตเดคเดฐเดฎเดพเดฏเดฟ เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเต‡เดตเดจเดคเตเดคเดฟเตปเตเดฑเต† #1 เดชเดคเดฟเดชเตเดชเต เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเด•
  • เดชเดคเดฟเดชเตเดชเต เดจเดฎเตเดชเตผ 2 เด…เดคเต เดชเต‹เดฒเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเดพเดฏเดฟ เดจเดฟเด™เตเด™เตพ เด•เดพเดฃเตเดฎเตเดชเต‹เตพ, เดชเดคเดฟเดชเตเดชเต เดจเดฎเตเดชเตผ 1 เดจเต€เด•เตเด•เด‚ เดšเต†เดฏเตเดฏเตเด•
  • เดšเต†เดฏเตโ€Œเดคเต!

เดŽเดณเตเดชเตเดชเด‚, เด…เดฒเตเดฒเต‡? เดจเดฟเตผเดญเดพเด—เตเดฏเดตเดถเดพเตฝ, เด‡เดคเต เด…เดคเตเดฐ เดฒเดณเดฟเดคเดฎเดฒเตเดฒ, เดžเด™เตเด™เตพ เด…เดคเต เดชเดฟเดจเตเดจเต€เดŸเต เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดจเต‹เด•เตเด•เดพเด‚. เด‡เดชเตเดชเต‹เตพ เดจเดฎเตเด•เตเด•เต เดฎเดฑเตเดฑเตŠเดฐเต เดธเดพเดงเดพเดฐเดฃ เดตเดฟเดจเตเดฏเดพเดธ เดชเตเดฐเด•เตเดฐเดฟเดฏ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเด‚ - เดจเต€เดฒ เดชเดšเตเดš เดตเดฟเดจเตเดฏเดพเดธเด‚.

เดจเดฟเด™เตเด™เตพ เดŽเดชเตเดชเต‹เดดเต†เด™เตเด•เดฟเดฒเตเด‚ เด•เต‡เดŸเตเดŸเดฟเดŸเตเดŸเตเดฃเตเดŸเต‹ เดจเต€เดฒ เดชเดšเตเดš เดตเดฟเดจเตเดฏเดพเดธเด‚? เด•เตเดฒเต—เดกเต เดซเต—เดฃเตเดŸเดฑเดฟ เด‡เดคเต เดตเดณเดฐเต† เดŽเดณเตเดชเตเดชเดฎเดพเด•เตเด•เตเดจเตเดจเต. เดตเต†เดฑเตเดคเต† เดจเต‹เด•เตเด•เต‚ เดˆ เดฒเต‡เด–เดจเด‚, เด‡เดตเดฟเดŸเต† เดžเด™เตเด™เตพ เด‡เดคเต เด•เต‚เดŸเตเดคเตฝ เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เดšเตเดฐเตเด•เตเด•เดคเตเดคเดฟเตฝ, เดจเต€เดฒ เดชเดšเตเดš เดตเดฟเดจเตเดฏเดพเดธเด‚ เดŽเด™เตเด™เดจเต† เดšเต†เดฏเตเดฏเดฃเดฎเต†เดจเตเดจเต เดžเด™เตเด™เตพ เดจเดฟเด™เตเด™เดณเต† เด“เตผเดฎเตเดฎเดฟเดชเตเดชเดฟเด•เตเด•เดพเด‚:

  • เดจเดฟเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเตŠเดกเด•เตเดทเตป เด•เต‹เดกเดฟเตปเตเดฑเต† เดฐเดฃเตเดŸเต เดชเด•เตผเดชเตเดชเตเด•เตพ ("เดจเต€เดฒ", "เดชเดšเตเดš") เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเตเดฃเตเดŸเต†เดจเตเดจเต เด‰เดฑเดชเตเดชเดพเด•เตเด•เตเด•;
  • เดŽเดฒเตเดฒเดพ เดŸเตเดฐเดพเดซเดฟเด•เตเด•เตเด‚ เดจเต€เดฒ เดชเดฐเดฟเดธเตเดฅเดฟเดคเดฟเดฏเดฟเดฒเต‡เด•เตเด•เต เดจเดฏเดฟเด•เตเด•เตเด•, เด…เดคเดพเดฏเดคเต. เด…เด™เตเด™เดจเต† เดชเตเดฐเตŠเดกเด•เตเดทเตป URL-เด•เตพ เด…เดตเดฟเดŸเต† เดชเต‹เดฏเดฟเตปเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต;
  • เดŽเดฒเตเดฒเดพ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดฎเดพเดฑเตเดฑเด™เตเด™เดณเตเด‚ เดนเดฐเดฟเดค เด…เดจเตเดคเดฐเต€เด•เตเดทเดคเตเดคเดฟเตฝ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด•;
  • url เดจเต€เดฒเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เดชเดšเตเดš เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเดฏเดฟเดฒเต‡เด•เตเด•เต เดฎเดพเดฑเตเดฑเตเด•

เดชเตเดฐเตŠเดกเด•เตเดทเตป เดฌเตเดฐเต‡เด•เตเด•เดฟเด‚เด—เดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เด†เด•เตเดฒเดชเตเดชเต†เดŸเดพเดคเต† เดชเตเดคเดฟเดฏ เดธเดตเดฟเดถเต‡เดทเดคเด•เตพ เดŽเดณเตเดชเตเดชเดคเตเดคเดฟเตฝ เด…เดตเดคเดฐเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดธเดฎเต€เดชเดจเดฎเดพเดฃเต เดฌเตเดฒเต‚ เด—เตเดฐเต€เตป เดตเดฟเดจเตเดฏเดพเดธเด‚. เดŽเดจเตเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดธเด‚เดญเดตเดฟเด•เตเด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝเดชเตเดชเต‹เดฒเตเด‚, "เด’เดฐเต เดธเตเดตเดฟเดšเตเดšเต เดซเตเดฒเดฟเด•เตเด•เตเดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดฒเต‚เดŸเต†" เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฎเตเดฎเตเดชเดคเตเดคเต† เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเดฏเดฟเดฒเต‡เด•เตเด•เต เดŽเดณเตเดชเตเดชเดคเตเดคเดฟเตฝ เดฎเดŸเด™เตเด™เดพเตป เด•เดดเดฟเดฏเตเด‚ เดŽเดจเตเดจเดคเดพเดฃเต เด‡เดคเดฟเดจเต เด•เดพเดฐเดฃเด‚.

เดฎเต‡เตฝเดชเตเดชเดฑเดžเตเดžเดตเดฏเต†เดฒเตเดฒเดพเด‚ เดตเดพเดฏเดฟเดšเตเดšเดคเดฟเดจเตเดถเต‡เดทเด‚, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดšเต‹เดฆเตเดฏเด‚ เดšเต‹เดฆเดฟเด•เตเด•เดพเด‚: เดชเต‚เดœเตเดฏเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเดฏ เดธเดฎเดฏเดตเตเด‚ เดจเต€เดฒ เดชเดšเตเดš เดตเดฟเดจเตเดฏเดพเดธเดตเตเดฎเดพเดฏเดฟ เดŽเดจเตเดคเต เดฌเดจเตเดงเดฎเตเดฃเตเดŸเต?

เดถเดฐเดฟ, เด…เดตเดฏเตโ€Œเด•เตเด•เต เดตเดณเดฐเต†เดฏเดงเดฟเด•เด‚ เดธเดพเดฎเตเดฏเดฎเตเดฃเตเดŸเต, เด•เดพเดฐเดฃเด‚ เด’เดฐเต‡ เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเดฏเตเดŸเต† เดฐเดฃเตเดŸเต เดชเด•เตผเดชเตเดชเตเด•เตพ เดชเดฐเดฟเดชเดพเดฒเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เด…เดต เดชเดฐเดฟเดชเดพเดฒเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เด‡เดฐเดŸเตเดŸเดฟ เดชเดฐเดฟเดถเตเดฐเดฎเด‚ เด†เดตเดถเตเดฏเดฎเดพเดฃเต. เด‡เดคเดพเดฃเต เดšเดฟเดฒ เดŸเต€เดฎเตเด•เตพ เด…เดตเด•เดพเดถเดชเตเดชเต†เดŸเตเดจเตเดจเดคเต เดฎเดพเตผเดŸเตเดŸเดฟเตป เดซเต—เดณเตผ, เดˆ เดธเดฎเต€เดชเดจเดคเตเดคเดฟเตปเตเดฑเต† เด’เดฐเต เดตเตเดฏเดคเดฟเดฏเดพเดจเด‚ เดชเดฟเดจเตเดคเตเดŸเดฐเตเด•:

เดตเต†เดฌเดฟเดจเตเด‚ เดกเตŠเดฎเต†เดฏเตเตป เดฒเต†เดฏเดฑเดฟเดจเตเดฎเดพเดฏเดฟ เดจเต€เดฒ-เดชเดšเตเดš เดธเตเดตเดฟเดšเตเดšเตเด•เตพ เดธเตƒเดทเตโ€ŒเดŸเดฟเดšเตเดšเต เด…เดคเต‡ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดพเดฃเต เดฎเดฑเตเดฑเตŠเดฐเต เด“เดชเตเดทเตป. เดˆ เดธเดฎเต€เดชเดจเดคเตเดคเดฟเตฝ, เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดชเดฒเดชเตเดชเต‹เดดเตเด‚ เด’เดฐเต เดชเตเดฐเดถเตเดจเดฎเดพเด•เดพเด‚, เดชเตเดฐเดคเตเดฏเต‡เด•เดฟเดšเตเดšเตเด‚ เดธเต‹เดซเตเดฑเตเดฑเตเดตเต†เดฏเดฑเดฟเตปเตเดฑเต† เด’เดฐเต เดชเตเดคเดฟเดฏ เดชเดคเดฟเดชเตเดชเดฟเดจเต† เดชเดฟเดจเตเดคเตเดฃเดฏเตเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเดฏเดฟ เดจเดฟเด™เตเด™เตพ เด…เดคเดฟเตปเตเดฑเต† เดธเตเด•เต€เดฎ เดฎเดพเดฑเตเดฑเต‡เดฃเตเดŸเดฟเดตเดฐเตเดฎเตเดชเต‹เตพ.

เด‡เดตเดฟเดŸเต† เดžเด™เตเด™เตพ เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเดฒเต† เดชเตเดฐเดงเดพเดจ เดชเตเดฐเดถเตเดจเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เดตเดฐเตเดจเตเดจเต. เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต. เดˆ เดตเดพเดšเด•เด‚ เด’เดจเตเดจเตเด•เต‚เดŸเดฟ เดจเต‹เด•เตเด•เดพเด‚.

เด’เดฐเต เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดฎเตˆเด—เตเดฐเต‡เดทเตป เดจเดŸเดคเตเดคเตเด•.

เด‡เดชเตเดชเต‹เตพ เดจเดฟเด™เตเด™เตพ เดธเตเดตเดฏเด‚ เด’เดฐเต เดšเต‹เดฆเตเดฏเด‚ เดšเต‹เดฆเดฟเด•เตเด•เดฃเด‚ - เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดฎเดพเดฑเตเดฑเด‚ เดชเดฟเดจเตเดจเต‹เดŸเตเดŸเต เดชเตŠเดฐเตเดคเตเดคเดชเตเดชเต†เดŸเตเดจเตเดจเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดŽเดจเตเดคเตเดšเต†เดฏเตเดฏเตเด‚? เด†เดชเตเดชเดฟเตปเตเดฑเต† เดŽเตปเตเดฑเต† เด†เดฆเตเดฏ เดชเดคเดฟเดชเตเดชเต เดคเด•เดฐเดฟเดฒเตเดฒเต‡? เดธเดคเตเดฏเดคเตเดคเดฟเตฝ เด‡เดคเตเดคเดจเตเดจเต†เดฏเดพเดฃเต เดธเด‚เดญเดตเดฟเด•เตเด•เตเด•...

เด…เดคเดฟเดจเดพเตฝ, เดชเต‚เดœเตเดฏเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเดฏ / เดจเต€เดฒ เดชเดšเตเดš เดตเดฟเดจเตเดฏเดพเดธเดคเตเดคเดฟเตปเตเดฑเต† เดตเดฒเดฟเดฏ เดจเต‡เดŸเตเดŸเด™เตเด™เตพ เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเตเดจเตเดจเดฟเดŸเตเดŸเตเด‚, เด•เดฎเตเดชเดจเดฟเด•เตพ เด…เดตเดฐเตเดŸเต† เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดธเตเดฐเด•เตเดทเดฟเดคเดฎเดพเดฏ เดชเตเดฐเด•เตเดฐเดฟเดฏ เดชเดฟเดจเตเดคเตเดŸเดฐเตเดจเตเดจเต:

  • เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตปเตเดฑเต† เดชเตเดคเดฟเดฏ เดชเดคเดฟเดชเตเดชเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดชเดพเด•เตเด•เต‡เดœเต เดคเดฏเตเดฏเดพเดฑเดพเด•เตเด•เตเด•
  • เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดทเดŸเตเดŸเต เดกเต—เตบ เดšเต†เดฏเตเดฏเตเด•
  • เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดฎเตˆเด—เตเดฐเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเด•
  • เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตปเตเดฑเต† เด’เดฐเต เดชเตเดคเดฟเดฏ เดชเดคเดฟเดชเตเดชเต เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด•

เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ, เดธเต€เดฑเต‹ เดกเตŒเตบเดŸเตˆเด‚ เดตเดฟเดจเตเดฏเดพเดธเด‚ เดชเตเดฐเดฏเต‹เดœเดจเดชเตเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจเดคเดฟเดจเต เดจเดฟเด™เตเด™เดณเตเดŸเต† เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเตเด‚ เด•เต‹เดกเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดŽเด™เตเด™เดจเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเดฎเต†เดจเตเดจเต เดžเด™เตเด™เตพ เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดชเดฑเดฏเตเด‚.

เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดชเตเดฐเดถเตเดจเด™เตเด™เตพ

เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเตฝ เดกเดพเดฑเตเดฑเดฏเตŠเดจเตเดจเตเด‚ เดธเด‚เดญเดฐเดฟเด•เตเด•เดพเดคเตเดค เด’เดฐเต เดธเตโ€Œเดฑเตเดฑเต‡เดฑเตเดฑเตโ€Œเดฒเต†เดธเต เด†เดชเตเดชเต เดจเดฟเด™เตเด™เดณเตเดŸเต† เดชเด•เตเด•เดฒเตเดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‰เดŸเดจเดŸเดฟ เดธเต€เดฑเต‹ เดกเต—เตบเดŸเตˆเด‚ เดตเดฟเดจเตเดฏเดพเดธเด‚ เดฒเดญเดฟเด•เตเด•เตเด‚. เดจเดฟเตผเดญเดพเด—เตเดฏเดตเดถเดพเตฝ, เดฎเดฟเด•เตเด• เดธเต‹เดซเตโ€Œเดฑเตเดฑเตโ€Œเดตเต†เดฏเดฑเตเด•เตพเด•เตเด•เตเด‚ เดŽเดตเดฟเดŸเต†เดฏเต†เด™เตเด•เดฟเดฒเตเด‚ เดกเดพเดฑเตเดฑ เดธเด‚เดญเดฐเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เด…เดคเตเด•เตŠเดฃเตเดŸเดพเดฃเต เดธเตผเด•เตเดฏเต‚เดŸเตเดŸเดฟเตฝ เดŽเดจเตเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เดตเดฐเตเดคเตเดคเตเดจเตเดจเดคเดฟเดจเต เดฎเตเดฎเตเดชเต เดจเดฟเด™เตเด™เตพ เดฐเดฃเตเดŸเตเดคเดตเดฃ เดšเดฟเดจเตเดคเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเต. เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเดฏ เดตเดฟเดจเตเดฏเดพเดธเด‚ เดธเดพเดงเตเดฏเดฎเดพเด•เตเดจเตเดจ เดคเดฐเดคเตเดคเดฟเตฝ เดธเตเด•เต€เดฎ เดŽเด™เตเด™เดจเต† เดฎเดพเดฑเตเดฑเดพเด‚ เดŽเดจเตเดจเดคเดฟเตปเตเดฑเต† เดตเดฟเดถเดฆเดพเด‚เดถเด™เตเด™เดณเดฟเดฒเต‡เด•เตเด•เต เด•เดŸเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดฎเตเดฎเตเดชเต, เดจเดฎเตเด•เตเด•เต เด†เดฆเตเดฏเด‚ เดชเดคเดฟเดชเตเดชเดฟเด‚เด—เต เดธเตเด•เต€เดฎเดฏเดฟเตฝ เดถเตเดฐเดฆเตเดง เด•เต‡เดจเตเดฆเตเดฐเต€เด•เดฐเดฟเด•เตเด•เดพเด‚.

เดชเดคเดฟเดชเตเดชเต เดธเตเด•เต€เด‚

เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ เดžเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด‚ เดซเตเดฒเตˆเดตเต‡ เด’เดฐเต เดชเดคเดฟเดชเตเดชเต เดจเดฟเดฏเดจเตเดคเตเดฐเดฃ เด‰เดชเด•เดฐเดฃเดฎเดพเดฏเดฟ (เดเด•เดฆเต‡เดถเด‚. เดตเดฟเดตเตผเดคเตเดคเดจเด‚: เดžเด™เตเด™เตพ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดฎเตˆเด—เตเดฐเต‡เดทเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเดพเดฃเต เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต). เดธเตเดตเดพเดญเดพเดตเดฟเด•เดฎเดพเดฏเตเด‚, เดžเด™เตเด™เตพ เดฌเดฟเตฝเดฑเตเดฑเต-เด‡เตป เดซเตเดฒเตˆเดตเต‡ เดชเดฟเดจเตเดคเตเดฃเดฏเตเดณเตเดณ เด’เดฐเต เดธเตเดชเตเดฐเดฟเด‚เด—เต เดฌเต‚เดŸเตเดŸเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด‚ เดŽเดดเตเดคเตเด•เดฏเตเด‚ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดธเดจเตเดฆเตผเดญเด‚ เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เดธเตเด•เต€เดฎ เดฎเตˆเด—เตเดฐเต‡เดทเตป เดจเดŸเดคเตเดคเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด‚. เดซเตเดฒเตˆเดตเต‡ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, เดฎเตˆเด—เตเดฐเต‡เดทเตป เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เตพ เดจเดฟเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดซเต‹เตพเดกเดฑเดฟเตฝ เดธเด‚เดญเดฐเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚ (เดธเตเดฅเดฟเดฐเดธเตเดฅเดฟเดคเดฟเดฏเดพเดฏเดฟ classpath:db/migration). เด…เดคเตเดคเดฐเด‚ เดฎเตˆเด—เตเดฐเต‡เดทเตป เดซเดฏเดฒเตเด•เดณเตเดŸเต† เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเด‚ เด‡เดตเดฟเดŸเต† เด•เดพเดฃเดพเด‚

โ””โ”€โ”€ db
 โ””โ”€โ”€ migration
     โ”œโ”€โ”€ V1__init.sql
     โ”œโ”€โ”€ V2__Add_surname.sql
     โ”œโ”€โ”€ V3__Final_migration.sql
     โ””โ”€โ”€ V4__Remove_lastname.sql

เดˆ เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเตฝ เดจเดฎเตเดฎเตพ 4 เดฎเตˆเด—เตเดฐเต‡เดทเตป เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เตพ เด•เดพเดฃเตเดจเตเดจเต, เด…เดคเต เดฎเตเดฎเตเดชเต เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดคเดฟเดŸเตเดŸเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เด’เดจเตเดจเดฟเดจเตเดชเตเดฑเด•เต† เด’เดจเตเดจเดพเดฏเดฟ เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเดชเตเดชเต†เดŸเตเด‚. เดซเดฏเดฒเตเด•เดณเดฟเดฒเตŠเดจเตเดจเต เดจเต‹เด•เตเด•เดพเด‚ (V1__init.sql) เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเด‚ เดŽเดจเตเดจ เดจเดฟเดฒเด•เตเด•เต.

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

เดŽเดฒเตเดฒเดพเด‚ เดคเดฟเด•เดšเตเดšเตเด‚ เดธเตเดตเดฏเด‚ เดตเดฟเดถเดฆเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดพเดฃเต: เดจเดฟเด™เตเด™เดณเตเดŸเต† เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดŽเด™เตเด™เดจเต† เดชเดฐเดฟเดทเตเด•เดฐเดฟเด•เตเด•เดฃเดฎเต†เดจเตเดจเต เดจเดฟเตผเดตเดšเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต SQL เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚. เดธเตเดชเตเดฐเดฟเด‚เด—เต เดฌเต‚เดŸเตเดŸเดฟเดจเต†เดฏเตเด‚ เดซเตเดฒเตˆเดตเต‡เดฏเต†เดฏเตเด‚ เด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เด•เต‚เดŸเตเดคเตฝ เดตเดฟเดตเดฐเด™เตเด™เตพเด•เตเด•เต, เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเด• เดธเตเดชเตเดฐเดฟเด‚เด—เต เดฌเต‚เดŸเตเดŸเต เดกเต‹เด•เตโ€Œเดธเต.

เดธเตเดชเตเดฐเดฟเด‚เด—เต เดฌเต‚เดŸเตเดŸเดฟเดจเตŠเดชเตเดชเด‚ เด’เดฐเต เดธเต‹เดดเตเดธเต เด•เตบเดŸเตเดฐเต‹เตพ เดŸเต‚เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดฒเต‚เดŸเต†, เดจเดฟเด™เตเด™เตพเด•เตเด•เต 2 เดตเดฒเดฟเดฏ เดจเต‡เดŸเตเดŸเด™เตเด™เตพ เดฒเดญเดฟเด•เตเด•เตเด‚:

  • เดจเดฟเด™เตเด™เตพ เด•เต‹เดกเต เดฎเดพเดฑเตเดฑเด™เตเด™เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดฎเดพเดฑเตเดฑเด™เตเด™เดณเต† เดตเต‡เตผเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต
  • เดจเดฟเด™เตเด™เดณเตเดŸเต† เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตปเตเดฑเต† เดฑเต‹เตพเด”เดŸเตเดŸเดฟเดจเตŠเดชเตเดชเด‚ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดฎเตˆเด—เตเดฐเต‡เดทเตป เดธเด‚เดญเดตเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเดพเดฏเดคเต. เดจเดฟเด™เตเด™เดณเตเดŸเต† เดตเดฟเดจเตเดฏเดพเดธ เดชเตเดฐเด•เตเดฐเดฟเดฏ เดฒเดณเดฟเดคเดฎเดพเด•เตเด•เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต

เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดชเตเดฐเดถเตเดจเด™เตเด™เตพ เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เตเดจเตเดจเต

เดฒเต‡เด–เดจเดคเตเดคเดฟเตปเตเดฑเต† เด…เดŸเตเดคเตเดค เดตเดฟเดญเดพเด—เดคเตเดคเดฟเตฝ, เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดฎเดพเดฑเตเดฑเด™เตเด™เดณเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เดฐเดฃเตเดŸเต เดธเดฎเต€เดชเดจเด™เตเด™เดณเดฟเตฝ เดžเด™เตเด™เตพ เดถเตเดฐเดฆเตเดง เด•เต‡เดจเตเดฆเตเดฐเต€เด•เดฐเดฟเด•เตเด•เตเด‚.

  • เดชเดฟเดจเตเดจเต‹เด•เตเด• เดชเตŠเดฐเตเดคเตเดคเด•เตเด•เต‡เดŸเต
  • เดชเดฟเดจเตเดจเต‹เด•เตเด• เด…เดจเตเดฏเต‹เดœเตเดฏเดค

เด†เดฆเตเดฏเดคเตเดคเต‡เดคเต, เดชเตเดฐเดพเดฅเดฎเดฟเด• เดคเดฏเตเดฏเดพเดฑเต†เดŸเตเดชเตเดชเดฟเดฒเตเดฒเดพเดคเต† เดธเต€เดฑเต‹ เดกเตŒเตบเดŸเตˆเด‚ เดกเดฟเดชเตเดฒเต‹เดฏเตโ€Œเดฎเต†เตปเตเดฑเต เดจเดŸเดคเตเดคเดฐเตเดคเต†เดจเตเดจ เดฎเตเดจเตเดจเดฑเดฟเดฏเดฟเดชเตเดชเดพเดฏเดฟ เด•เดฃเด•เตเด•เดพเด•เตเด•เตเด‚... เดฐเดฃเตเดŸเดพเดฎเดคเตเดคเต‡เดคเต เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเดฏ เด’เดฐเต เดตเดฟเดจเตเดฏเดพเดธเด‚ เดŽเด™เตเด™เดจเต† เดจเดŸเดคเตเดคเดพเดฎเต†เดจเตเดจเตเด‚ เด…เดคเต‡ เดธเดฎเดฏเด‚ เดฌเดพเด•เตเด•เตโ€Œเดตเต‡เตผเดกเต เด•เต‹เด‚เดชเดพเดฑเตเดฑเดฟเดฌเดฟเดฒเดฟเดฑเตเดฑเดฟ เดจเดฟเดฒเดจเดฟเตผเดคเตเดคเดพเดฎเต†เดจเตเดจเตเด‚ เด‰เดณเตเดณ เด’เดฐเต เดชเดฐเดฟเดนเดพเดฐเด‚ เดตเดพเด—เตเดฆเดพเดจเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.

เดžเด™เตเด™เตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเตป เดชเต‹เด•เตเดจเตเดจ เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เด’เดฐเต เดฒเดณเดฟเดคเดฎเดพเดฏ เดธเตเดชเตเดฐเดฟเด‚เด—เต เดฌเต‚เดŸเตเดŸเต เดซเตเดฒเตˆเดตเต‡ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚ Person ั first_name ะธ last_name เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเตฝ (เดเด•เดฆเต‡เดถเด‚. เดตเดฟเดตเตผเดคเตเดคเดจเด‚: Person เด’เดฐเต เดฎเต‡เดถเดฏเตเด‚ first_name ะธ last_name - เด‡เดคเดฟเดฒเต† เดตเดฏเดฒเตเด•เดณเดพเดฃเต). เดชเต‡เดฐเตเดฎเดพเดฑเตเดฑเดพเตป เดžเด™เตเด™เตพ เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต last_name ะฒ surname.

เด…เดจเตเดฎเดพเดจเด™เตเด™เตพ

เดตเดฟเดถเดฆเดพเด‚เดถเด™เตเด™เดณเดฟเดฒเต‡เด•เตเด•เต เด•เดŸเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดฎเตเดฎเตเดชเต, เดžเด™เตเด™เดณเตเดŸเต† เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เดณเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดžเด™เตเด™เตพ เด•เตเดฑเดšเตเดšเต เด…เดจเตเดฎเดพเดจเด™เตเด™เตพ เดจเดŸเดคเตเดคเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เดžเด™เตเด™เตพ เดจเต‡เดŸเดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจ เดชเตเดฐเดงเดพเดจ เดซเดฒเด‚ เดตเดณเดฐเต† เดฒเดณเดฟเดคเดฎเดพเดฏ เด’เดฐเต เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚.

Zametka. เดฌเดฟเดธเดฟเดจเดธเต เดชเตเดฐเต‹-เดŸเดฟเดชเตเดชเต. เดชเตเดฐเด•เตเดฐเดฟเดฏเด•เตพ เดฒเดณเดฟเดคเดฎเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดฒเต‚เดŸเต† เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดชเดฟเดจเตเดคเตเดฃเดฏเดฟเตฝ เดงเดพเดฐเดพเดณเด‚ เดชเดฃเด‚ เดฒเดพเดญเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚ (เดจเดฟเด™เตเด™เดณเตเดŸเต† เด•เดฎเตเดชเดจเดฟเดฏเดฟเตฝ เด•เต‚เดŸเตเดคเตฝ เด†เดณเตเด•เตพ เดœเต‹เดฒเดฟ เดšเต†เดฏเตเดฏเตเดจเตเดจเต, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เต‚เดŸเตเดคเตฝ เดชเดฃเด‚ เดฒเดพเดญเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚)!

เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดฑเต‹เตพเดฌเดพเด•เตเด•เต เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเดฟเดฒเตเดฒ

เด‡เดคเต เดตเดฟเดจเตเดฏเดพเดธ เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเต† เดฒเดณเดฟเดคเดฎเดพเด•เตเด•เตเดจเตเดจเต (เดšเดฟเดฒ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดฑเต‹เตพเดฌเดพเด•เตเด•เตเด•เตพ, เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตฝ เดฑเต‹เตพเดฌเดพเด•เตเด•เต เดชเต‹เดฒเต†, เดฎเดฟเด•เตเด•เดตเดพเดฑเตเด‚ เด…เดธเดพเดงเตเดฏเดฎเดพเดฃเต). เด…เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เดฎเดพเดคเตเดฐเด‚ เดชเดฟเตปเดตเดฒเดฟเด•เตเด•เดพเตป เดžเด™เตเด™เตพ เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดชเตเดชเต†เดŸเตเดจเตเดจเต. เดˆ เดฐเต€เดคเดฟเดฏเดฟเตฝ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดตเตเดฏเดคเตเดฏเดธเตเดค เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเตเด•เดณเตเดฃเตเดŸเต†เด™เตเด•เดฟเตฝเดชเตเดชเต‹เดฒเตเด‚ (เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, SQL, NoSQL), เดจเดฟเด™เตเด™เดณเตเดŸเต† เดตเดฟเดจเตเดฏเดพเดธ เดชเตˆเดชเตเดชเตเดฒเตˆเตป เดธเดฎเดพเดจเดฎเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚.

เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด’เดฐเต เดชเดคเดฟเดชเตเดชเต เดคเดฟเดฐเดฟเด•เต† เด•เตŠเดฃเตเดŸเตเดตเดฐเตเดจเตเดจเดคเต เดŽเดฒเตเดฒเดพเดฏเตเดชเตเดชเต‹เดดเตเด‚ เดธเดพเดงเตเดฏเดฎเดพเดฏเดฟเดฐเดฟเด•เตเด•เดฃเด‚ (เด‡เดจเดฟเดฏเดฟเดฒเตเดฒ)

เดฑเต‹เตพเดฌเดพเด•เตเด•เต เด†เดตเดถเตเดฏเดฎเตเดณเตเดณเดชเตเดชเต‹เตพ เดฎเดพเดคเตเดฐเด‚ เดšเต†เดฏเตเดฏเดฃเด‚. เดจเดฟเดฒเดตเดฟเดฒเต† เดชเดคเดฟเดชเตเดชเดฟเตฝ เดŽเดณเตเดชเตเดชเดคเตเดคเดฟเตฝ เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เดพเดจเดพเด•เดพเดคเตเดค เด’เดฐเต เดฌเด—เต เด‰เดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, เดเดฑเตเดฑเดตเตเด‚ เดชเตเดคเดฟเดฏ เดตเตผเด•เตเด•เดฟเด‚เด—เต เดชเดคเดฟเดชเตเดชเดฟเดฒเต‡เด•เตเด•เต เดฎเดŸเด™เตเด™เดพเตป เดžเด™เตเด™เตพเด•เตเด•เต เด•เดดเดฟเดฏเตเด‚. เดˆ เดเดฑเตเดฑเดตเตเด‚ เดชเตเดคเดฟเดฏ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจ เดชเดคเดฟเดชเตเดชเต เดฎเตเดฎเตเดชเดคเตเดคเต‡เดคเดพเดฃเต†เดจเตเดจเต เดžเด™เตเด™เตพ เด…เดจเตเดฎเดพเดจเดฟเด•เตเด•เตเดจเตเดจเต. เด’เดจเตเดจเดฟเดฒเดงเดฟเด•เด‚ เดฑเต‹เตพเด”เดŸเตเดŸเตเด•เตพเด•เตเด•เดพเดฏเดฟ เด•เต‹เดกเตเด‚ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เด…เดจเตเดฏเต‹เดœเตเดฏเดคเดฏเตเด‚ เดจเดฟเดฒเดจเดฟเตผเดคเตเดคเตเดจเตเดจเดคเต เดตเดณเดฐเต† เดฌเตเดฆเตเดงเดฟเดฎเตเดŸเตเดŸเตเดณเตเดณเดคเตเด‚ เดšเต†เดฒเดตเต‡เดฑเดฟเดฏเดคเตเดฎเดพเดฃเต.

เด•เตเดฑเดฟเดชเตเดชเต. เด•เต‚เดŸเตเดคเตฝ เดตเดพเดฏเดจเดพเด•เตเดทเดฎเดคเดฏเตเด•เตเด•เดพเดฏเดฟ, เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ เดžเด™เตเด™เตพ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตปเตเดฑเต† เดชเตเดฐเดงเดพเดจ เดชเดคเดฟเดชเตเดชเต เดฎเดพเดฑเตเดฑเตเด‚.

เด˜เดŸเตเดŸเด‚ 1: เดชเตเดฐเดพเดฐเด‚เดญ เด…เดตเดธเตเดฅ

เด…เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดชเดคเดฟเดชเตเดชเต: 1.0.0
DB เดชเดคเดฟเดชเตเดชเต: v1

เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚

เด‡เดคเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตปเตเดฑเต† เดชเตเดฐเดพเดฐเด‚เดญ เด…เดตเดธเตเดฅเดฏเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚.

เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดฎเดพเดฑเตเดฑเด™เตเด™เตพ

DB เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต last_name.

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

เด•เต‹เดกเต เดฎเดพเดฑเตเดฑเด™เตเด™เตพ

เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดตเตเดฏเด•เตเดคเดฟเด—เดค เดกเดพเดฑเตเดฑ เดธเด‚เดญเดฐเดฟเด•เตเด•เตเดจเตเดจเต last_name:

/*
 * Copyright 2012-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package sample.flyway;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String lastName;

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return this.lastName;
    }

    public void setLastName(String lastname) {
        this.lastName = lastname;
    }

    @Override
    public String toString() {
        return "Person [firstName=" + this.firstName + ", lastName=" + this.lastName
                + "]";
    }
}

เดชเดฟเดจเตเดจเดฟเดฒเต‡เด•เตเด•เต เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดฒเตเดฒเดพเดคเตเดค เด•เต‹เดณเด‚ เดชเตเดจเตผเดจเดพเดฎเด•เดฐเดฃเด‚

เด’เดฐเต เด•เต‹เดณเดคเตเดคเดฟเตปเตเดฑเต† เดชเต‡เดฐเต เดŽเด™เตเด™เดจเต† เดฎเดพเดฑเตเดฑเดพเด‚ เดŽเดจเตเดจเดคเดฟเตปเตเดฑเต† เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเด‚ เดจเต‹เด•เตเด•เดพเด‚:

เดถเตเดฐเดฆเตเดง. เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เด‰เดฆเดพเดนเดฐเดฃเด‚ เดฎเดจเดƒเดชเต‚เตผเดตเด‚ เด•เดพเดฐเตเดฏเด™เตเด™เตพ เดคเด•เตผเด•เตเด•เตเด‚. เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เด…เดจเตเดฏเต‹เดœเตเดฏเดคเดฏเตเดŸเต† เดชเตเดฐเดถเตเดจเด‚ เดคเต†เดณเดฟเดฏเดฟเด•เตเด•เดพเตป เดžเด™เตเด™เตพ เด‡เดคเต เด•เดพเดฃเดฟเด•เตเด•เตเดจเตเดจเต.

เด…เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดชเดคเดฟเดชเตเดชเต: 2.0.0.BAD

DB เดชเดคเดฟเดชเตเดชเต: v2bad

เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚

เดจเดฟเดฒเดตเดฟเดฒเต† เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เด’เดฐเต‡ เดธเดฎเดฏเด‚ เดฐเดฃเตเดŸเต เดธเดจเตเดฆเตผเดญเด™เตเด™เตพ (เดชเดดเดฏเดคเตเด‚ เดชเตเดคเดฟเดฏเดคเตเด‚) เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เดžเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ. เด…เดคเดฟเดจเดพเตฝ, เดชเต‚เดœเตเดฏเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเดฏ เดตเดฟเดจเตเดฏเดพเดธเด‚ เดจเต‡เดŸเดพเตป เดชเตเดฐเดฏเดพเดธเดฎเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚ (เด…เดจเตเดฎเดพเดจเด™เตเด™เตพ เด•เดฃเด•เตเด•เดฟเดฒเต†เดŸเตเด•เตเด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เด…เดคเต เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ เด…เดธเดพเดงเตเดฏเดฎเดพเดฃเต).

เดŽ/เดฌเดฟ เดŸเต†เดธเตเดฑเตเดฑเดฟเด‚เด—เต

เดžเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดชเดคเดฟเดชเตเดชเต เด‰เดฃเตเดŸเต เดŽเดจเตเดจเดคเดพเดฃเต เดจเดฟเดฒเดตเดฟเดฒเต† เดธเดพเดนเดšเดฐเตเดฏเด‚ 1.0.0, เดชเตเดฐเตŠเดกเด•เตเดทเตป, เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดŽเดจเตเดจเดฟเดตเดฏเดฟเตฝ เดตเดฟเดจเตเดฏเดธเดฟเดšเตเดšเดฟเดŸเตเดŸเตเดฃเตเดŸเต v1. เดžเด™เตเด™เตพ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตปเตเดฑเต† เดฐเดฃเตเดŸเดพเดฎเดคเตเดคเต† เด‰เดฆเดพเดนเดฐเดฃเดฎเดพเดฏ เดชเดคเดฟเดชเตเดชเต เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต 2.0.0.BAD, เด•เต‚เดŸเดพเดคเต† เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เด…เดชเตเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเด• v2bad.

เด˜เดŸเตเดŸเด™เตเด™เตพ:

  1. เดชเดคเดฟเดชเตเดชเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตปเตเดฑเต† เด’เดฐเต เดชเตเดคเดฟเดฏ เด‰เดฆเดพเดนเดฐเดฃเด‚ เดตเดฟเดจเตเดฏเดธเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต 2.0.0.BADเดเดคเต เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เด…เดชเตเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต v2bad
  2. เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเตฝ v2bad เด•เต‡เดพเดณเด‚ last_name เด‡เดชเตเดชเต‹เตพ เดจเดฟเดฒเดตเดฟเดฒเดฟเดฒเตเดฒ - เด…เดคเต เดฎเดพเดฑเตเดฑเดฟ surname
  3. เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเตเด‚ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด…เดชเตโ€Œเดกเต‡เดฑเตเดฑเตเด‚ เดตเดฟเดœเดฏเด•เดฐเดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต, เดšเดฟเดฒ เดธเดจเตเดฆเตผเดญเด™เตเด™เตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต 1.0.0, เดฎเดฑเตเดฑเตเดณเตเดณเดตเตผ - เด‡เตป 2.0.0.BAD. เดŽเดฒเตเดฒเดพเด‚ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดฟเดชเตเดชเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต v2bad
  4. เดชเดคเดฟเดชเตเดชเดฟเตปเตเดฑเต† เดŽเดฒเตเดฒเดพ เดธเดจเตเดฆเตผเดญเด™เตเด™เดณเตเด‚ 1.0.0 เด…เดตเตผ เด•เต‹เดณเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เดกเดพเดฑเตเดฑ เดคเดฟเดฐเตเด•เดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เตเดฎเต†เดจเตเดจเดคเดฟเดจเดพเตฝ เดชเดฟเดถเด•เตเด•เตพ เดŽเดฑเดฟเดฏเดพเตป เดคเตเดŸเด™เตเด™เตเด‚ last_nameเด†เตผ เด‡เดชเตเดชเต‹เตพ เดจเดฟเดฒเดตเดฟเดฒเดฟเดฒเตเดฒ
  5. เดชเดคเดฟเดชเตเดชเดฟเตปเตเดฑเต† เดŽเดฒเตเดฒเดพ เดธเดจเตเดฆเตผเดญเด™เตเด™เดณเตเด‚ 2.0.0.BAD เดชเตเดฐเดถเตเดจเด™เตเด™เดณเดฟเดฒเตเดฒเดพเดคเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเด‚

เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เดพเดฃเดพเดจเดพเด•เตเดจเตเดจเดคเตเดชเต‹เดฒเต†, เดžเด™เตเด™เตพ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเดฒเตเด‚ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดฟเดฒเตเด‚ เดชเดฟเดจเตเดจเดฟเดฒเต‡เด•เตเด•เต เดชเตŠเดฐเตเดคเตเดคเดชเตเดชเต†เดŸเดพเดคเตเดค เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เดตเดฐเตเดคเตเดคเตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, A/B เดชเดฐเดฟเดถเต‹เดงเดจ เด…เดธเดพเดงเตเดฏเดฎเดพเดฃเต.

เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดฑเต‹เตพเดฌเดพเด•เตเด•เต

A/B เดตเดฟเดจเตเดฏเดพเดธเด‚ เดšเต†เดฏเตเดฏเดพเตป เดถเตเดฐเดฎเดฟเดšเตเดšเดคเดฟเดจเต เดถเต‡เดทเด‚ เดŽเดจเตเดจเต เดจเดฎเตเด•เตเด•เต เด…เดจเตเดฎเดพเดจเดฟเด•เตเด•เดพเด‚ (เดเด•เดฆเต‡เดถเด‚. per.: เดฐเดšเดฏเดฟเดคเดพเดตเต เด‰เดฆเตเดฆเต‡เดถเดฟเดšเตเดšเดคเต เด‡เดตเดฟเดŸเต† A/B เดชเดฐเดฟเดถเต‹เดงเดจเดฏเดพเดฃเต) เดชเดคเดฟเดชเตเดชเดฟเดฒเต‡เด•เตเด•เต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดคเดฟเดฐเดฟเด•เต† เด•เตŠเดฃเตเดŸเตเดตเดฐเดฃเดฎเต†เดจเตเดจเต เดžเด™เตเด™เตพ เดคเต€เดฐเตเดฎเดพเดจเดฟเดšเตเดšเต 1.0.0. เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดฑเต‹เตพเดฌเดพเด•เตเด•เต เดšเต†เดฏเตเดฏเดพเตป เดžเด™เตเด™เตพ เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒเต†เดจเตเดจเต เดชเดฑเดฏเดพเด‚.

เด˜เดŸเตเดŸเด™เตเด™เตพ:

  1. เดชเดคเดฟเดชเตเดชเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด‰เดฆเดพเดนเดฐเดฃเด‚ เดžเด™เตเด™เตพ เดจเดฟเตผเดคเตเดคเตเดจเตเดจเต 2.0.0.BAD
  2. เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เด‡เดชเตเดชเต‹เดดเตเด‚ เด‰เดฃเตเดŸเต v2bad
  3. เดชเดคเดฟเดชเตเดชเต เดฎเตเดคเตฝ 1.0.0 เด…เดคเต เดŽเดจเตเดคเดพเดฃเต†เดจเตเดจเต เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเดจเตเดจเดฟเดฒเตเดฒ surname, เดžเด™เตเด™เตพ เดชเดฟเดถเด•เตเด•เตพ เด•เดพเดฃเตเด‚
  4. เดจเดฐเด•เด‚ เดคเด•เตผเดจเตเดจเต, เดจเดฎเตเด•เตเด•เต เด‡เดจเดฟ เดคเดฟเดฐเดฟเดšเตเดšเตเดชเต‹เด•เดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ

เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เดพเดฃเดพเดจเดพเด•เตเดจเตเดจเดคเตเดชเต‹เดฒเต†, เดžเด™เตเด™เตพ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเดฒเตเด‚ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดฟเดฒเตเด‚ เดชเดฟเดจเตเดจเดฟเดฒเต‡เด•เตเด•เต เดชเตŠเดฐเตเดคเตเดคเดชเตเดชเต†เดŸเดพเดคเตเดค เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เดตเดฐเตเดคเตเดคเตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เดžเด™เตเด™เตพเด•เตเด•เต เดฎเตเดฎเตเดชเดคเตเดคเต† เดชเดคเดฟเดชเตเดชเดฟเดฒเต‡เด•เตเด•เต เดฎเดŸเด™เตเด™เดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ.

เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดทเตป เดฒเต‹เด—เตเด•เตพ

Backward incompatible scenario:

01) Run 1.0.0
02) Wait for the app (1.0.0) to boot
03) Generate a person by calling POST localhost:9991/person to version 1.0.0
04) Run 2.0.0.BAD
05) Wait for the app (2.0.0.BAD) to boot
06) Generate a person by calling POST localhost:9991/person to version 1.0.0 <-- this should fail
07) Generate a person by calling POST localhost:9992/person to version 2.0.0.BAD <-- this should pass

Starting app in version 1.0.0
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

{"firstName":"b73f639f-e176-4463-bf26-1135aace2f57","lastName":"b73f639f-e176-4463-bf26-1135aace2f57"}

Starting app in version 2.0.0.BAD
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

curl: (22) The requested URL returned error: 500 Internal Server Error

Generate a person in version 2.0.0.BAD
Sending a post to 127.0.0.1:9995/person. This is the response:

{"firstName":"e156be2e-06b6-4730-9c43-6e14cfcda125","surname":"e156be2e-06b6-4730-9c43-6e14cfcda125"}

เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดฎเดพเดฑเตเดฑเด™เตเด™เตพ

เดชเต‡เดฐเตเดฎเดพเดฑเตเดฑเตเดจเตเดจ เดฎเตˆเด—เตเดฐเต‡เดทเตป เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต last_name ะฒ surname

เดธเตเดฐเต‹เดคเดธเตเดธเต เดซเตเดฒเตˆเดตเต‡ เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต:

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

เดชเต‡เดฐเตเดฎเดพเดฑเตเดฑเตเดจเตเดจ เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต last_name.

-- This change is backward incompatible - you can't do A/B testing
ALTER TABLE PERSON CHANGE last_name surname VARCHAR;

เด•เต‹เดกเต เดฎเดพเดฑเตเดฑเด™เตเด™เตพ

เดžเด™เตเด™เตพ เดซเต€เตฝเดกเต เดจเดพเดฎเด‚ เดฎเดพเดฑเตเดฑเดฟ lastName เด“เตบ surname.

เดชเดฟเดจเตเดจเดฟเดฒเต‡เด•เตเด•เต-เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดพเดฏ เดฐเต€เดคเดฟเดฏเดฟเตฝ เด•เต‹เดณเดคเตเดคเดฟเตปเตเดฑเต† เดชเต‡เดฐเต เดฎเดพเดฑเตเดฑเตเดจเตเดจเต

เดจเดฎเตเดฎเตพ เด…เดญเดฟเดฎเตเด–เต€เด•เดฐเดฟเดšเตเดšเต‡เด•เตเด•เดพเดตเตเดจเตเดจ เดเดฑเตเดฑเดตเตเด‚ เดธเดพเดงเดพเดฐเดฃเดฎเดพเดฏ เด…เดตเดธเตเดฅเดฏเดพเดฃเดฟเดคเต. เดจเดฎเตเด•เตเด•เต เดชเดฟเดจเตเดจเดฟเดฒเต‡เด•เตเด•เต เดชเตŠเดฐเตเดคเตเดคเดชเตเดชเต†เดŸเดพเดคเตเดค เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เดตเดฐเตเดคเตเดคเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เดธเต€เดฑเต‹-เดกเตŒเตบเดŸเตˆเด‚ เดตเดฟเดจเตเดฏเดพเดธเดคเตเดคเดฟเดจเดพเดฏเดฟ, เด…เดงเดฟเด• เด˜เดŸเตเดŸเด™เตเด™เดณเดฟเดฒเตเดฒเดพเดคเต† เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดฎเตˆเด—เตเดฐเต‡เดทเตป เดชเตเดฐเดฏเต‹เด—เดฟเด•เตเด•เดฐเตเดคเต†เดจเตเดจเต เดžเด™เตเด™เตพ เด‡เดคเดฟเดจเด•เด‚ เดคเต†เดณเดฟเดฏเดฟเดšเตเดšเดฟเดŸเตเดŸเตเดฃเตเดŸเต. เดฒเต‡เด–เดจเดคเตเดคเดฟเตปเตเดฑเต† เดˆ เดตเดฟเดญเดพเด—เดคเตเดคเดฟเตฝ, เดชเดฟเดจเตเดจเต‹เด•เตเด• เด…เดจเตเดฏเต‹เดœเตเดฏเดค เดจเดฟเดฒเดจเดฟเตผเดคเตเดคเดฟเด•เตเด•เตŠเดฃเตเดŸเต เด†เดตเดถเตเดฏเดฎเตเดณเตเดณ เดซเดฒเด‚ เดจเต‡เดŸเตเดจเตเดจเดคเดฟเดจเต เดžเด™เตเด™เตพ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดฎเตˆเด—เตเดฐเต‡เดทเดจเตเด•เตพเด•เตเด•เตŠเดชเตเดชเด‚ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตปเตเดฑเต† 3 เดตเดฟเดจเตเดฏเดพเดธเด™เตเด™เตพ เดจเดŸเดคเตเดคเตเด‚.

Zametka. เดžเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เดชเดคเดฟเดชเตเดชเต เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เด‰เดฃเตเดŸเต†เดจเตเดจเต เด“เตผเด•เตเด•เตเด• v1. เด…เดคเดฟเตฝ เดจเดฟเดฐเด•เตพ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต first_name ะธ last_name. เดจเดฎเตเดฎเตพ เดฎเดพเดฑเดฃเด‚ last_name เด“เตบ surname. เดžเด™เตเด™เตพเด•เตเด•เต เด†เดชเตเดชเต เดชเดคเดฟเดชเตเดชเตเด‚ เด‰เดฃเตเดŸเต 1.0.0, เด‡เดคเตเดตเดฐเต† เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดคเตเดคเดคเต surname.

เด˜เดŸเตเดŸเด‚ 2: เด•เตเดŸเตเด‚เดฌเดชเตเดชเต‡เดฐเต เดšเต‡เตผเด•เตเด•เตเด•

เด…เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดชเดคเดฟเดชเตเดชเต: 2.0.0
DB เดชเดคเดฟเดชเตเดชเต: v2

เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚

เด’เดฐเต เดชเตเดคเดฟเดฏ เด•เต‹เดณเด‚ เดšเต‡เตผเด•เตเด•เตเด•เดฏเตเด‚ เด…เดคเดฟเดฒเต† เด‰เดณเตเดณเดŸเด•เตเด•เด™เตเด™เตพ เดชเด•เตผเดคเตเดคเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดฒเต‚เดŸเต†, เดžเด™เตเด™เตพ เดชเดฟเดจเตเดจเดฟเดฒเต‡เด•เตเด•เต เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดพเดฏ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเต. เด…เดคเต‡ เดธเดฎเดฏเด‚, เดจเดฎเตเดฎเตพ JAR เดฑเต‹เตพเดฌเดพเด•เตเด•เต เดšเต†เดฏเตเดฏเตเด•เดฏเต‹ เดชเดดเดฏ JAR เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเด•เดฏเต‹ เดšเต†เดฏเตเดคเดพเตฝ, เด…เดคเต เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดทเตป เดธเดฎเดฏเดคเตเดคเต เดคเด•เดฐเดฟเดฒเตเดฒ.

เดžเด™เตเด™เตพ เด’เดฐเต เดชเตเดคเดฟเดฏ เดชเดคเดฟเดชเตเดชเต เดชเตเดฑเดคเตเดคเดฟเดฑเด•เตเด•เตเด•เดฏเดพเดฃเต

เด˜เดŸเตเดŸเด™เตเด™เตพ:

  1. เด’เดฐเต เดชเตเดคเดฟเดฏ เด•เต‹เดณเด‚ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเตป เด’เดฐเต เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดฎเตˆเด—เตเดฐเต‡เดทเตป เดจเดŸเดคเตเดคเตเด• surname. เด‡เดชเตเดชเต‹เตพ เดจเดฟเด™เตเด™เดณเตเดŸเต† DB เดชเดคเดฟเดชเตเดชเต v2
  2. เดจเดฟเดจเตเดจเต เดกเดพเดฑเตเดฑ เดชเด•เตผเดคเตเดคเตเด• last_name ะฒ surname. เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เตเด•เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดˆ เดกเดพเดฑเตเดฑ เดงเดพเดฐเดพเดณเด‚ เด‰เดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เตพ เดฌเดพเดšเตเดšเต เดฎเตˆเด—เตเดฐเต‡เดทเตป เดชเดฐเดฟเด—เดฃเดฟเด•เตเด•เดฃเด‚!
  3. เด…เดต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เด•เต‹เดกเต เดŽเดดเตเดคเตเด• เดฐเดฃเตเดŸเตเด‚ ะธ ะฝะพะฒั‹ะนเด’เดชเตเดชเด‚ เดชเดดเดฏเดคเต เด•เต‡เดพเดณเด‚. เด‡เดชเตเดชเต‹เตพ เดจเดฟเด™เตเด™เดณเตเดŸเต† เด†เดชเตเดชเต เดชเดคเดฟเดชเตเดชเต 2.0.0
  4. เด•เต‹เดณเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดฎเต‚เดฒเตเดฏเด‚ เดตเดพเดฏเดฟเด•เตเด•เตเด• surname, เด‡เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ null, เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดŽเตฝ เดจเดฟเดจเตเดจเตast_nameเดŽเด™เตเด•เดฟเตฝ surname เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดฟเดฏเดฟเดŸเตเดŸเดฟเดฒเตเดฒ. เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เดพเด‚ getLastName() เด•เต‹เดกเดฟเตฝ เดจเดฟเดจเตเดจเต, เด…เดคเต เด”เดŸเตเดŸเตเดชเตเดŸเตเดŸเต เดšเต†เดฏเตเดฏเตเด‚ null เดŽเดจเตเดจเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดจเดฟเด™เตเด™เดณเตเดŸเต† เด…เดชเต‡เด•เตเดท เดชเดฟเตปเดตเดฒเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ 3.0.0 เด‡เดคเดฟเดจเดพเดฏเดฟ 2.0.0.

เดจเดฟเด™เตเด™เตพ เดธเตเดชเตเดฐเดฟเด‚เด—เต เดฌเต‚เดŸเตเดŸเต เดซเตเดฒเตˆเดตเต‡เดฏเดพเดฃเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต†เด™เตเด•เดฟเตฝ, เดชเดคเดฟเดชเตเดชเต เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เดˆ เดฐเดฃเตเดŸเต เด˜เดŸเตเดŸเด™เตเด™เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเด‚ 2.0.0 เด…เดชเต‡เด•เตเดทเด•เตพ. เดจเดฟเด™เตเด™เตพ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดชเดคเดฟเดชเตเดชเดฟเด‚เด—เต เด‰เดชเด•เดฐเดฃเด‚ เดธเตเดตเดฎเต‡เดงเดฏเดพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เด‡เดคเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต เดจเดฟเด™เตเด™เตพ เดฐเดฃเตเดŸเต เดตเตเดฏเดคเตเดฏเดธเตเดค เด•เดพเดฐเตเดฏเด™เตเด™เตพ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดฟเดตเดฐเตเด‚ (เด†เดฆเตเดฏเด‚ db เดชเดคเดฟเดชเตเดชเต เดธเตเดตเดฎเต‡เดงเดฏเดพ เด…เดชเตเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเด•, เดคเตเดŸเตผเดจเตเดจเต เดชเตเดคเดฟเดฏ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเด•).

เด…เดคเต เดชเตเดฐเดงเดพเดจเดฎเดพเดฃเต. เดชเตเดคเตเดคเดพเดฏเดฟ เดธเตƒเดทเตเดŸเดฟเดšเตเดš เด•เต‹เดณเด‚ เด“เตผเด•เตเด•เตเด• เดชเดพเดŸเดฟเดฒเตเดฒ เดŽเดจเตเดจเต NULL เด…เดฒเตเดฒ. เดจเดฟเด™เตเด™เตพ เด’เดฐเต เดฑเต‹เตพเดฌเดพเด•เตเด•เต เดšเต†เดฏเตเดฏเตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เดชเดดเดฏ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเต เดชเตเดคเดฟเดฏ เด•เต‹เดณเดคเตเดคเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เด…เดฑเดฟเดฏเดฟเดฒเตเดฒ, เด…เดคเต เดธเดฎเดฏเดคเตเดคเต เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเด•เดฏเตเดฎเดฟเดฒเตเดฒ Insert. เดŽเดจเตเดจเดพเตฝ เดจเดฟเด™เตเด™เตพ เดˆ เดจเดฟเดฏเดจเตเดคเตเดฐเดฃเดตเตเด‚ เดšเต‡เตผเดคเตเดคเดพเตฝ เดจเดฟเด™เตเด™เดณเตเดŸเต† db เด†เดฏเดฟเดฐเดฟเด•เตเด•เตเด‚ v2, เด‡เดคเดฟเดจเต เดชเตเดคเดฟเดฏ เดจเดฟเดฐเดฏเตเดŸเต† เดฎเต‚เดฒเตเดฏเด‚ เด•เตเดฐเดฎเต€เด•เดฐเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เด‡เดคเต เดจเดฟเดฏเดจเตเดคเตเดฐเดฃเด™เตเด™เดณเตเดŸเต† เดฒเด‚เด˜เดจเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เดจเดฏเดฟเด•เตเด•เตเด‚.

เด…เดคเต เดชเตเดฐเดงเดพเดจเดฎเดพเดฃเต. เดจเดฟเด™เตเด™เตพ เดฐเต€เดคเดฟ เดจเต€เด•เตเด•เด‚ เดšเต†เดฏเตเดฏเดฃเด‚ getLastName(), เด•เดพเดฐเดฃเด‚ เดชเดคเดฟเดชเตเดชเดฟเตฝ 3.0.0 เด•เต‹เดกเดฟเตฝ เด•เต‹เดณเด‚ เดŽเดจเตเดจ เด†เดถเดฏเดฎเดฟเดฒเตเดฒ last_name. เด…เดคเดฟเดจเตผเดคเตเดฅเด‚ เด…เดตเดฟเดŸเต† null เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเด‚ เดŽเดจเตเดจเดพเดฃเต. เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฐเต€เดคเดฟ เด‰เดชเต‡เด•เตเดทเดฟเดšเตเดšเต เดšเต†เด•เตเด•เตเด•เตพ เดšเต‡เตผเด•เตเด•เดพเด‚ null, เดŽเดจเตเดจเดพเตฝ เด•เต‚เดŸเตเดคเตฝ เดฎเต†เดšเตเดšเดชเตเดชเต†เดŸเตเดŸ เดชเดฐเดฟเดนเดพเดฐเด‚ เดฏเตเด•เตเดคเดฟเดฏเดฟเตฝ เด…เดคเต เด‰เดฑเดชเตเดชเดพเด•เตเด•เตเด• เดŽเดจเตเดจเดคเดพเดฃเต getSurname() เดจเดฟเด™เตเด™เตพ เดถเดฐเดฟเดฏเดพเดฏ เดชเต‚เดœเตเดฏเดฎเดฒเตเดฒเดพเดคเตเดค เดฎเต‚เดฒเตเดฏเด‚ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเดคเตเดคเต.

เดŽ/เดฌเดฟ เดŸเต†เดธเตเดฑเตเดฑเดฟเด‚เด—เต

เดžเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดชเดคเดฟเดชเตเดชเต เด‰เดฃเตเดŸเต เดŽเดจเตเดจเดคเดพเดฃเต เดจเดฟเดฒเดตเดฟเดฒเต† เดธเดพเดนเดšเดฐเตเดฏเด‚ 1.0.0, เดชเตเดฐเตŠเดกเด•เตเดทเตป, เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดŽเดจเตเดจเดฟเดตเดฏเดฟเตฝ เดตเดฟเดจเตเดฏเดธเดฟเดšเตเดšเต v1. เดชเดคเดฟเดชเตเดชเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตปเตเดฑเต† เดฐเดฃเตเดŸเดพเดฎเดคเตเดคเต† เด‰เดฆเดพเดนเดฐเดฃเด‚ เดžเด™เตเด™เตพเด•เตเด•เต เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต 2.0.0เดเดคเต เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เด…เดชเตเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเด‚ v2.

เด˜เดŸเตเดŸเด™เตเด™เตพ:

  1. เดชเดคเดฟเดชเตเดชเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตปเตเดฑเต† เด’เดฐเต เดชเตเดคเดฟเดฏ เด‰เดฆเดพเดนเดฐเดฃเด‚ เดตเดฟเดจเตเดฏเดธเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต 2.0.0เดเดคเต เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เด…เดชเตเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต v2
  2. เด‡เดคเดฟเดจเดฟเดŸเดฏเดฟเตฝ เดšเดฟเดฒ เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เดชเดคเดฟเดชเตเดชเต เดธเดจเตเดฆเตผเดญเด™เตเด™เตพ เดตเดดเดฟ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดคเต 1.0.0
  3. เด…เดชเตโ€Œเดกเต‡เดฑเตเดฑเต เดตเดฟเดœเดฏเด•เดฐเดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต, เด•เต‚เดŸเดพเดคเต† เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดชเดคเดฟเดชเตเดชเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตปเตเดฑเต† เด’เดจเตเดจเดฟเดฒเดงเดฟเด•เด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจ เดธเดจเตเดฆเตผเดญเด™เตเด™เดณเตเดฃเตเดŸเต 1.0.0 เดฎเดฑเตเดฑเต เดชเดคเดฟเดชเตเดชเตเด•เดณเตเด‚ 2.0.0. เดŽเดฒเตเดฒเดพเดตเดฐเตเด‚ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเตเดฎเดพเดฏเดฟ เด†เดถเดฏเดตเดฟเดจเดฟเดฎเดฏเด‚ เดจเดŸเดคเตเดคเตเดจเตเดจเต v2
  4. เดชเดคเดฟเดชเตเดชเต 1.0.0 เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเดฒเต† เด•เตเดŸเตเด‚เดฌเดชเตเดชเต‡เดฐเต เด•เต‹เดณเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ, เดชเด•เตเดทเต‡ เดชเดคเดฟเดชเตเดชเต 2.0.0 เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต. เด…เดตเตผ เดชเดฐเดธเตเดชเดฐเด‚ เด‡เดŸเดชเต†เดŸเตเดจเตเดจเดฟเดฒเตเดฒ, เดชเดฟเดถเด•เตเด•เตพ เด‰เดฃเตเดŸเดพเด•เดฐเตเดคเต.
  5. เดชเดคเดฟเดชเตเดชเต 2.0.0 เดชเดดเดฏเดคเตเด‚ เดชเตเดคเดฟเดฏเดคเตเดฎเดพเดฏ เด•เต‹เดณเด™เตเด™เดณเดฟเตฝ เดกเดพเดฑเตเดฑ เดธเด‚เดญเดฐเดฟเด•เตเด•เตเดจเตเดจเต, เดชเดฟเดจเตเดจเดพเด•เตเด• เด…เดจเตเดฏเต‹เดœเตเดฏเดค เด‰เดฑเดชเตเดชเดพเด•เตเด•เตเดจเตเดจเต

เด…เดคเต เดชเตเดฐเดงเดพเดจเดฎเดพเดฃเต. เดชเดดเดฏ/เดชเตเดคเดฟเดฏ เดจเดฟเดฐเดฏเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดฎเต‚เดฒเตเดฏเด™เตเด™เดณเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟ เด‡เดจเด™เตเด™เตพ เด•เดฃเด•เตเด•เดพเด•เตเด•เตเดจเตเดจ เดŽเดจเตเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เด…เดจเตเดตเต‡เดทเดฃเด™เตเด™เตพ เดจเดฟเด™เตเด™เตพเด•เตเด•เตเดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‡เดชเตเดชเต‹เตพ เดคเดจเดฟเดชเตเดชเด•เตผเดชเตเดชเต เดฎเต‚เดฒเตเดฏเด™เตเด™เตพ เด‰เดฃเตเดŸเต†เดจเตเดจเต เดจเดฟเด™เตเด™เตพ เด“เตผเด•เตเด•เดฃเด‚ (เดฎเดฟเด•เตเด•เดตเดพเดฑเตเด‚ เด…เดต เด‡เดชเตเดชเต‹เดดเตเด‚ เดฎเตˆเด—เตเดฐเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดพเดฃเต). เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เด…เด•เตเดทเดฐเดคเตเดคเดฟเตฝ เด†เดฐเด‚เดญเดฟเดšเตเดš เด…เดตเดธเดพเดจ เดจเดพเดฎเด‚ (เด•เต‹เดณเด‚ เดŽเดจเตเดคเตเดคเดจเตเดจเต†เดฏเดพเดฏเดพเดฒเตเด‚) เด‰เดชเดฏเต‹เด•เตเดคเดพเด•เตเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚ เด•เดฃเด•เตเด•เดพเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เตพ เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเตเดตเต†เด™เตเด•เดฟเตฝ A, เดกเดพเดฑเตเดฑ เดฎเตˆเด—เตเดฐเต‡เดทเตป เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเด•เตเดจเตเดจเดคเตเดตเดฐเต† (old โ†’ new เด•เต‹เดณเด‚) เดจเดฟเด™เตเด™เตพ เด’เดฐเต เดชเตเดคเดฟเดฏ เด•เต‹เดณเด‚ เด…เดจเตเดตเต‡เดทเดฟเด•เตเด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดธเตเดฅเดฟเดฐเดคเดฏเดฟเดฒเตเดฒเดพเดคเตเดค เดกเดพเดฑเตเดฑ เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเดฟเด•เตเด•เดพเด‚.

เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดฑเต‹เตพเดฌเดพเด•เตเด•เต

เด‡เดชเตเดชเต‹เตพ เดžเด™เตเด™เตพเด•เตเด•เต เด†เดชเตเดชเต เดชเดคเดฟเดชเตเดชเตเดฃเตเดŸเต 2.0.0 เด•เต‚เดŸเดพเดคเต† เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เด‡เตป v2.

เด˜เดŸเตเดŸเด™เตเด™เตพ:

  1. เดจเดฟเด™เตเด™เดณเตเดŸเต† เด…เดชเต‡เด•เตเดท เดชเดคเดฟเดชเตเดชเดฟเดฒเต‡เด•เตเด•เต เดคเดฟเดฐเดฟเด•เต† เด•เตŠเดฃเตเดŸเตเดตเดฐเดฟเด• 1.0.0.
  2. เดชเดคเดฟเดชเตเดชเต 1.0.0 เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเตฝ เด’เดฐเต เด•เต‹เดณเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ surname, เด…เดคเดฟเดจเดพเตฝ เดฑเต‹เตพเดฌเดพเด•เตเด•เต เดตเดฟเดœเดฏเดฟเด•เตเด•เดฃเด‚

DB เดฎเดพเดฑเตเดจเตเดจเต

เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเตฝ เดชเต‡เดฐเตเดณเตเดณ เด’เดฐเต เด•เต‹เดณเด‚ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต last_name.

เดซเตเดฒเตˆเดตเต‡ เด‰เดฑเดตเดฟเดŸ เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต:

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดšเต‡เตผเด•เตเด•เตเด• surname.

เดถเตเดฐเดฆเตเดง. เดจเดฟเด™เตเด™เตพ เดšเต‡เตผเด•เตเด•เตเดจเตเดจ เดจเดฟเดฐเดฏเดฟเดฒเต‡เด•เตเด•เต NOT NULL เดจเดฟเดฏเดจเตเดคเตเดฐเดฃเด™เตเด™เดณเตŠเดจเตเดจเตเด‚ เดšเต‡เตผเด•เตเด•เดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒเต†เดจเตเดจเต เด“เตผเด•เตเด•เตเด•. เดจเดฟเด™เตเด™เตพ JAR เดฑเต‹เตพเดฌเดพเด•เตเด•เต เดšเต†เดฏเตเดฏเตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เดชเดดเดฏ เดชเดคเดฟเดชเตเดชเดฟเดจเต เดšเต‡เตผเดคเตเดค เด•เต‹เดณเดคเตเดคเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดฏเดพเดคเตŠเดฐเต เดงเดพเดฐเดฃเดฏเตเดฎเตเดฃเตเดŸเดพเด•เดฟเดฒเตเดฒ, เด…เดคเต เดธเตเดตเดฏเดฎเต‡เดต NULL เด†เดฏเดฟ เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเด‚. เด…เดคเตเดคเดฐเดฎเตŠเดฐเต เดชเดฐเดฟเดฎเดฟเดคเดฟ เด‰เดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, เดชเดดเดฏ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด•เต‡เดตเดฒเด‚ เดคเด•เดฐเตเด‚.

-- NOTE: This field can't have the NOT NULL constraint cause if you rollback, the old version won't know about this field
-- and will always set it to NULL
ALTER TABLE PERSON ADD surname varchar(255);

-- WE'RE ASSUMING THAT IT'S A FAST MIGRATION - OTHERWISE WE WOULD HAVE TO MIGRATE IN BATCHES
UPDATE PERSON SET PERSON.surname = PERSON.last_name

เด•เต‹เดกเต เดฎเดพเดฑเตเดฑเด™เตเด™เตพ

เดžเด™เตเด™เตพ เดกเดพเดฑเตเดฑ เดธเด‚เดญเดฐเดฟเด•เตเด•เตเดจเตเดจเต last_name, เด•เต‚เดŸเดพเดคเต† surname. เด…เดคเต‡ เดธเดฎเดฏเด‚ เดžเด™เตเด™เตพ เดตเดพเดฏเดฟเด•เตเด•เตเดจเตเดจเต last_name, เดˆ เด•เต‹เดณเด‚ เดเดฑเตเดฑเดตเตเด‚ เดชเตเดฐเดธเด•เตเดคเดฎเดพเดฏเดคเดฟเดจเดพเตฝ. เดตเดฟเดจเตเดฏเดพเดธ เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเดฟเตฝ, เดšเดฟเดฒ เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เด‡เดคเตเดตเดฐเต† เด…เดชเตโ€Œเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเดพเดคเตเดค เด’เดฐเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด‡เตปเดธเตโ€Œเดฑเตเดฑเตปเดธเต เดตเดดเดฟ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตโ€Œเดคเดฟเดฐเดฟเด•เตเด•เดพเด‚.

/*
 * Copyright 2012-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package sample.flyway;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String lastName;
    private String surname;

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    /**
     * Reading from the new column if it's set. If not the from the old one.
     *
     * When migrating from version 1.0.0 -> 2.0.0 this can lead to a possibility that some data in
     * the surname column is not up to date (during the migration process lastName could have been updated).
     * In this case one can run yet another migration script after all applications have been deployed in the
     * new version to ensure that the surname field is updated.
     *
     * However it makes sense since when looking at the migration from 2.0.0 -> 3.0.0. In 3.0.0 we no longer
     * have a notion of lastName at all - so we don't update that column. If we rollback from 3.0.0 -> 2.0.0 if we
     * would be reading from lastName, then we would have very old data (since not a single datum was inserted
     * to lastName in version 3.0.0).
     */
    public String getSurname() {
        return this.surname != null ? this.surname : this.lastName;
    }

    /**
     * Storing both FIRST_NAME and SURNAME entries
     */
    public void setSurname(String surname) {
        this.lastName = surname;
        this.surname = surname;
    }

    @Override
    public String toString() {
        return "Person [firstName=" + this.firstName + ", lastName=" + this.lastName + ", surname=" + this.surname
                + "]";
    }
}

เด˜เดŸเตเดŸเด‚ 3: เด•เต‹เดกเดฟเตฝ เดจเดฟเดจเตเดจเต เด…เดตเดธเดพเดจ_เดชเต‡เดฐเต เดจเต€เด•เตเด•เด‚เดšเต†เดฏเตเดฏเตเดจเตเดจเต

เด…เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดชเดคเดฟเดชเตเดชเต: 3.0.0

DB เดชเดคเดฟเดชเตเดชเต:v3

เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚

เด•เตเดฑเดฟเดชเตเดชเต per.: เดชเตเดฐเดคเตเดฏเด•เตเดทเดฎเดพเดฏเตเด‚, เดฏเดฅเดพเตผเดคเตเดฅ เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ เดฐเดšเดฏเดฟเดคเดพเดตเต เดˆ เดฌเตเดฒเต‹เด•เตเด•เดฟเตปเตเดฑเต† เดตเดพเดšเด•เด‚ เด˜เดŸเตเดŸเด‚ 2-เตฝ เดจเดฟเดจเตเดจเต เดคเต†เดฑเตเดฑเดพเดฏเดฟ เดชเด•เตผเดคเตเดคเดฟ. เดˆ เด˜เดŸเตเดŸเดคเตเดคเดฟเตฝ, เด•เต‹เดณเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดค เดจเต€เด•เตเด•เด‚ เดšเต†เดฏเตเดฏเดพเตป เดฒเด•เตเดทเตเดฏเดฎเดฟเดŸเตเดŸเตเดณเตเดณ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด•เต‹เดกเดฟเตฝ เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เดตเดฐเตเดคเตเดคเดฃเด‚. last_name.

เด’เดฐเต เดชเตเดคเดฟเดฏ เด•เต‹เดณเด‚ เดšเต‡เตผเด•เตเด•เตเด•เดฏเตเด‚ เด…เดคเดฟเดฒเต† เด‰เดณเตเดณเดŸเด•เตเด•เด™เตเด™เตพ เดชเด•เตผเดคเตเดคเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดฒเต‚เดŸเต†, เดžเด™เตเด™เตพ เดชเดฟเดจเตเดจเดฟเดฒเต‡เด•เตเด•เต เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดพเดฏ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เดธเตƒเดทเตเดŸเดฟเดšเตเดšเต. เด•เต‚เดŸเดพเดคเต†, เดจเดฎเตเดฎเตพ JAR เดฑเต‹เตพเดฌเดพเด•เตเด•เต เดšเต†เดฏเตเดฏเตเด•เดฏเต‹ เดชเดดเดฏ JAR เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเด•เดฏเต‹ เดšเต†เดฏเตเดคเดพเตฝ, เด…เดคเต เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดทเตป เดธเดฎเดฏเดคเตเดคเต เดคเด•เดฐเดฟเดฒเตเดฒ.

เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดฑเต‹เตพเดฌเดพเด•เตเด•เต

เดจเดฟเดฒเดตเดฟเตฝ เดžเด™เตเด™เตพเด•เตเด•เต เด†เดชเตเดชเต เดชเดคเดฟเดชเตเดชเตเดฃเตเดŸเต 3.0.0 เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเตเด‚ v3. เดชเดคเดฟเดชเตเดชเต 3.0.0 เดŽเดจเตเดจเดคเดฟเดฒเต‡เด•เตเด•เต เดกเดพเดฑเตเดฑ เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ last_name. เด‡เดคเดฟเดจเตผเดคเตเดฅเด‚ เด‡เตป surname เดเดฑเตเดฑเดตเตเด‚ เด•เดพเดฒเดฟเด•เดฎเดพเดฏ เดตเดฟเดตเดฐเด™เตเด™เตพ เดธเด‚เดญเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต.

เด˜เดŸเตเดŸเด™เตเด™เตพ:

  1. เดจเดฟเด™เตเด™เดณเตเดŸเต† เด…เดชเต‡เด•เตเดท เดชเดคเดฟเดชเตเดชเดฟเดฒเต‡เด•เตเด•เต เดคเดฟเดฐเดฟเด•เต† เด•เตŠเดฃเตเดŸเตเดตเดฐเดฟเด• 2.0.0.
  2. เดชเดคเดฟเดชเตเดชเต 2.0.0 เด‰เดชเดฏเต‹เด—เด™เตเด™เดณเตเด‚ last_name ะธ surname.
  3. เดชเดคเดฟเดชเตเดชเต 2.0.0 เดŽเดŸเตเด•เตเด•เตเด‚ surname, เด‡เดคเต เดชเต‚เดœเตเดฏเดฎเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ -last_name

เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดฎเดพเดฑเตเดฑเด™เตเด™เตพ

เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเตฝ เด˜เดŸเดจเดพเดชเดฐเดฎเดพเดฏ เดฎเดพเดฑเตเดฑเด™เตเด™เดณเตŠเดจเตเดจเตเดฎเดฟเดฒเตเดฒ. เดชเดดเดฏ เดกเดพเดฑเตเดฑเดฏเตเดŸเต† เด…เดจเตเดคเดฟเดฎ เดฎเตˆเด—เตเดฐเต‡เดทเตป เดจเดŸเดคเตเดคเดพเตป เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต:

-- WE'RE ASSUMING THAT IT'S A FAST MIGRATION - OTHERWISE WE WOULD HAVE TO MIGRATE IN BATCHES
-- ALSO WE'RE NOT CHECKING IF WE'RE NOT OVERRIDING EXISTING ENTRIES. WE WOULD HAVE TO COMPARE
-- ENTRY VERSIONS TO ENSURE THAT IF THERE IS ALREADY AN ENTRY WITH A HIGHER VERSION NUMBER
-- WE WILL NOT OVERRIDE IT.
UPDATE PERSON SET PERSON.surname = PERSON.last_name;

-- DROPPING THE NOT NULL CONSTRAINT; OTHERWISE YOU WILL TRY TO INSERT NULL VALUE OF THE LAST_NAME
-- WITH A NOT_NULL CONSTRAINT.
ALTER TABLE PERSON MODIFY COLUMN last_name varchar(255) NULL DEFAULT NULL;

เด•เต‹เดกเต เดฎเดพเดฑเตเดฑเด™เตเด™เตพ

เด•เตเดฑเดฟเดชเตเดชเต per.: เดˆ เดฌเตเดฒเต‹เด•เตเด•เดฟเตปเตเดฑเต† เดตเดฟเดตเดฐเดฃเดตเตเด‚ เดฐเดšเดฏเดฟเดคเดพเดตเต เด˜เดŸเตเดŸเด‚ 2-เตฝ เดจเดฟเดจเตเดจเต เดคเต†เดฑเตเดฑเดพเดฏเดฟ เดชเด•เตผเดคเตเดคเดฟ. เดฒเต‡เด–เดจเดคเตเดคเดฟเตปเตเดฑเต† เดฏเตเด•เตเดคเดฟเด•เตเด•เต เด…เดจเตเดธเตƒเดคเดฎเดพเดฏเดฟ, เดˆ เด˜เดŸเตเดŸเดคเตเดคเดฟเดฒเต† เด•เต‹เดกเดฟเดฒเต† เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เด•เต‹เดณเดตเตเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจ เด˜เดŸเด•เด™เตเด™เตพ เด…เดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดจเต€เด•เตเด•เด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเดพเดฃเต เดฒเด•เตเดทเตเดฏเดฎเดฟเดŸเตเดจเตเดจเดคเต. last_name.

เดžเด™เตเด™เตพ เดกเดพเดฑเตเดฑ เดธเด‚เดญเดฐเดฟเด•เตเด•เตเดจเตเดจเต last_name, เด•เต‚เดŸเดพเดคเต† surname. เด•เต‚เดŸเดพเดคเต†, เดžเด™เตเด™เตพ เด•เต‹เดณเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเดพเดฏเดฟเด•เตเด•เตเดจเตเดจเต last_name, เด…เดคเต เดเดฑเตเดฑเดตเตเด‚ เดชเตเดฐเดธเด•เตเดคเดฎเดพเดฏเดคเดฟเดจเดพเตฝ. เดตเดฟเดจเตเดฏเดพเดธ เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเดฟเตฝ, เดšเดฟเดฒ เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เด‡เดคเตเดตเดฐเต† เด…เดชเตโ€Œเด—เตเดฐเต‡เดกเต เดšเต†เดฏเตเดฏเดพเดคเตเดค เด’เดฐเต เดธเดจเตเดฆเตผเดญเดคเตเดคเดฟเดฒเต‚เดŸเต† เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดคเต‡เด•เตเด•เดพเด‚.

/*
 * Copyright 2012-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package sample.flyway;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String surname;

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getSurname() {
        return this.surname;
    }

    public void setSurname(String lastname) {
        this.surname = lastname;
    }

    @Override
    public String toString() {
        return "Person [firstName=" + this.firstName + ", surname=" + this.surname
                + "]";
    }
}

เด˜เดŸเตเดŸเด‚ 4: เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเตฝ เดจเดฟเดจเตเดจเต เดฒเดพเดธเตเดฑเตเดฑเต_เดจเต†เดฏเดฟเด‚ เดจเต€เด•เตเด•เด‚เดšเต†เดฏเตเดฏเตเดจเตเดจเต

เด…เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดชเดคเดฟเดชเตเดชเต: 4.0.0

DB เดชเดคเดฟเดชเตเดชเต: v4

เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚

เดชเดคเดฟเดชเตเดชเต เด•เต‹เดกเต เดตเดธเตเดคเตเดค เด•เดพเดฐเดฃเด‚ 3.0.0 เด•เต‹เดณเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเดฟเดฒเตเดฒ last_name, เดจเดฎเตเดฎเตพ เดคเดฟเดฐเดฟเดšเตเดšเต เดชเต‹เดฏเดพเตฝ เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดทเตป เดธเดฎเดฏเดคเตเดคเต เดฎเต‹เดถเดฎเดพเดฏ เด’เดจเตเดจเตเด‚ เดธเด‚เดญเดตเดฟเด•เตเด•เดฟเดฒเตเดฒ 3.0.0 เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเตฝ เดจเดฟเดจเตเดจเต เด’เดฐเต เด•เต‹เดณเด‚ เดจเต€เด•เตเด•เด‚ เดšเต†เดฏเตเดคเดคเดฟเดจเต เดถเต‡เดทเด‚.

เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดทเตป เดฒเต‹เด—เตเด•เตพ

We will do it in the following way:

01) Run 1.0.0
02) Wait for the app (1.0.0) to boot
03) Generate a person by calling POST localhost:9991/person to version 1.0.0
04) Run 2.0.0
05) Wait for the app (2.0.0) to boot
06) Generate a person by calling POST localhost:9991/person to version 1.0.0
07) Generate a person by calling POST localhost:9992/person to version 2.0.0
08) Kill app (1.0.0)
09) Run 3.0.0
10) Wait for the app (3.0.0) to boot
11) Generate a person by calling POST localhost:9992/person to version 2.0.0
12) Generate a person by calling POST localhost:9993/person to version 3.0.0
13) Kill app (3.0.0)
14) Run 4.0.0
15) Wait for the app (4.0.0) to boot
16) Generate a person by calling POST localhost:9993/person to version 3.0.0
17) Generate a person by calling POST localhost:9994/person to version 4.0.0

Starting app in version 1.0.0
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

{"firstName":"52b6e125-4a5c-429b-a47a-ef18bbc639d2","lastName":"52b6e125-4a5c-429b-a47a-ef18bbc639d2"}

Starting app in version 2.0.0

Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

{"firstName":"e41ee756-4fa7-4737-b832-e28827a00deb","lastName":"e41ee756-4fa7-4737-b832-e28827a00deb"}

Generate a person in version 2.0.0
Sending a post to 127.0.0.1:9992/person. This is the response:

{"firstName":"0c1240f5-649a-4bc5-8aa9-cff855f3927f","lastName":"0c1240f5-649a-4bc5-8aa9-cff855f3927f","surname":"0c1240f5-649a-4bc5-8aa9-cff855f3927f"}

Killing app 1.0.0

Starting app in version 3.0.0

Generate a person in version 2.0.0
Sending a post to 127.0.0.1:9992/person. This is the response:
{"firstName":"74d84a9e-5f44-43b8-907c-148c6d26a71b","lastName":"74d84a9e-5f44-43b8-907c-148c6d26a71b","surname":"74d84a9e-5f44-43b8-907c-148c6d26a71b"}

Generate a person in version 3.0.0
Sending a post to 127.0.0.1:9993/person. This is the response:
{"firstName":"c6564dbe-9ab5-40ae-9077-8ae6668d5862","surname":"c6564dbe-9ab5-40ae-9077-8ae6668d5862"}

Killing app 2.0.0

Starting app in version 4.0.0

Generate a person in version 3.0.0
Sending a post to 127.0.0.1:9993/person. This is the response:

{"firstName":"cbe942fc-832e-45e9-a838-0fae25c10a51","surname":"cbe942fc-832e-45e9-a838-0fae25c10a51"}

Generate a person in version 4.0.0
Sending a post to 127.0.0.1:9994/person. This is the response:

{"firstName":"ff6857ce-9c41-413a-863e-358e2719bf88","surname":"ff6857ce-9c41-413a-863e-358e2719bf88"}

DB เดฎเดพเดฑเตเดจเตเดจเต

เดคเดพเดฐเดคเดฎเตเดฏเต‡เดจ v3 เดžเด™เตเด™เตพ เด•เต‹เดณเด‚ เดจเต€เด•เตเด•เด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต last_name เด•เต‚เดŸเดพเดคเต† เดตเดฟเดŸเตเดŸเตเดชเต‹เดฏ เดจเดฟเดฏเดจเตเดคเตเดฐเดฃเด™เตเด™เตพ เดšเต‡เตผเด•เตเด•เตเด•.

-- REMOVE THE COLUMN
ALTER TABLE PERSON DROP last_name;

-- ADD CONSTRAINTS
UPDATE PERSON SET surname='' WHERE surname IS NULL;
ALTER TABLE PERSON ALTER COLUMN surname VARCHAR NOT NULL;

เด•เต‹เดกเต เดฎเดพเดฑเตเดฑเด™เตเด™เตพ

เด•เต‹เดกเดฟเตฝ เดฎเดพเดฑเตเดฑเด™เตเด™เดณเตŠเดจเตเดจเตเดฎเดฟเดฒเตเดฒ.

เดคเต€เดฐเตเดฎเดพเดจเด‚

เดจเดฟเดฐเดตเดงเดฟ เดฌเดพเด•เตเด•เตโ€Œเดตเต‡เตผเดกเต-เด…เดจเตเดฏเต‹เดœเตเดฏ เดตเดฟเดจเตเดฏเดพเดธเด™เตเด™เตพ เดจเดŸเดคเตเดคเดฟ เดžเด™เตเด™เตพ เดฌเดพเด•เตเด•เตโ€Œเดตเต‡เตผเดกเต-เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดพเดฏ เด•เต‹เดณเดคเตเดคเดฟเตปเตเดฑเต† เดชเต‡เดฐเต เดฎเดพเดฑเตเดฑเด‚ เดตเดฟเดœเดฏเด•เดฐเดฎเดพเดฏเดฟ เดชเตเดฐเดฏเต‹เด—เดฟเดšเตเดšเต. เดจเดŸเดคเตเดคเดฟเดฏ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เดณเตเดŸเต† เด’เดฐเต เดธเด‚เด—เตเดฐเดนเด‚ เดšเตเดตเดŸเต†:

  1. เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดชเดคเดฟเดชเตเดชเดฟเตปเตเดฑเต† เดตเดฟเดจเตเดฏเดพเดธเด‚ 1.0.0 ั v1 เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดธเตเด•เต€เดฎ (เดจเดฟเดฐเดฏเตเดŸเต† เดชเต‡เดฐเต = last_name)
  2. เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดชเดคเดฟเดชเตเดชเดฟเตปเตเดฑเต† เดตเดฟเดจเตเดฏเดพเดธเด‚ 2.0.0, เด‡เดคเดฟเตฝ เดกเดพเดฑเตเดฑ เดธเด‚เดญเดฐเดฟเด•เตเด•เตเดจเตเดจเต last_name ะธ surname. เด…เดชเต‡เด•เตเดทเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเดพเดฏเดฟเด•เตเด•เตเดจเตเดจเต last_name. เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดชเดคเดฟเดชเตเดชเดฟเดฒเดพเดฃเต v2เดชเต‹เดฒเตเดณเตเดณ เดจเดฟเดฐเด•เตพ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต last_name, เด’เดชเตเดชเด‚ surname. surname l เตปเตเดฑเต† เด’เดฐเต เดชเด•เตผเดชเตเดชเดพเดฃเตast_name. (เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เตเด•: เดˆ เดจเดฟเดฐเดฏเตเด•เตเด•เต เด…เดธเดพเดงเตเดตเดพเดฏ เดชเดฐเดฟเดฎเดฟเดคเดฟ เด‰เดฃเตเดŸเดพเด•เดฐเตเดคเต)
  3. เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดชเดคเดฟเดชเตเดชเดฟเตปเตเดฑเต† เดตเดฟเดจเตเดฏเดพเดธเด‚ 3.0.0, เด…เดคเดฟเตฝ เดฎเดพเดคเตเดฐเด‚ เดกเดพเดฑเตเดฑ เดธเด‚เดญเดฐเดฟเด•เตเด•เตเดจเตเดจเต surname เด•เต‚เดŸเดพเดคเต† เด•เตเดŸเตเด‚เดฌเดชเตเดชเต‡เดฐเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเดพเดฏเดฟเด•เตเด•เตเดจเตเดจเต. เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเดจเต† เดธเด‚เดฌเดจเตเดงเดฟเดšเตเดšเดฟเดŸเดคเตเดคเต‹เดณเด‚, เด…เดตเดธเดพเดจ เดฎเตˆเด—เตเดฐเต‡เดทเตป เดจเดŸเด•เตเด•เตเดจเตเดจเต last_name ะฒ surname. เด’เดฐเต เดชเดฐเดฟเดฎเดฟเดคเดฟเดฏเตเด‚ NULL เด…เดฒเตเดฒ เดจเดฟเดจเตเดจเต เดจเต€เด•เตเด•เด‚ เดšเต†เดฏเตเดคเต last_name. เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เด‡เดชเตเดชเต‹เตพ เดชเดคเดฟเดชเตเดชเดฟเดฒเดพเดฃเต v3
  4. เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดชเดคเดฟเดชเตเดชเดฟเตปเตเดฑเต† เดตเดฟเดจเตเดฏเดพเดธเด‚ 4.0.0 - เด•เต‹เดกเดฟเตฝ เดฎเดพเดฑเตเดฑเด™เตเด™เดณเตŠเดจเตเดจเตเด‚ เดตเดฐเตเดคเตเดคเดฟเดฏเดฟเดŸเตเดŸเดฟเดฒเตเดฒ. เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดตเดฟเดจเตเดฏเดพเดธเด‚ v4, เด…เดคเต เดจเต€เด•เตเด•เด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต last_name. เด‡เดตเดฟเดŸเต† เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเดฒเต‡เด•เตเด•เต เดจเดทเตโ€ŒเดŸเดฎเดพเดฏ เดเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดจเดฟเดฏเดจเตเดคเตเดฐเดฃเด™เตเด™เตพ เดšเต‡เตผเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚.

เดˆ เดธเดฎเต€เดชเดจเด‚ เดชเดฟเดจเตเดคเตเดŸเดฐเตเดจเตเดจเดคเดฟเดฒเต‚เดŸเต†, เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต/เด…เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด•เต‹เด‚เดชเดพเดฑเตเดฑเดฟเดฌเดฟเดฒเดฟเดฑเตเดฑเดฟ เดคเด•เตผเด•เตเด•เดพเดคเต† เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดŽเดฒเตเดฒเดพเดฏเตเดชเตเดชเต‹เดดเตเด‚ เด’เดฐเต เดชเดคเดฟเดชเตเดชเต เดคเดฟเดฐเดฟเด•เต† เด•เตŠเดฃเตเดŸเตเดตเดฐเดพเตป เด•เดดเดฟเดฏเตเด‚.

เด•เต‡เดพเดกเต

เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เดŽเดฒเตเดฒเดพ เด•เต‹เดกเตเด•เดณเตเด‚ เด‡เดตเดฟเดŸเต† เดฒเดญเตเดฏเดฎเดพเดฃเต เดธเดพเดฎเต‚เดนเดฟเด•เด‚. เด…เดงเดฟเด• เดตเดฟเดตเดฐเดฃเด‚ เดšเตเดตเดŸเต†เดฏเตเดฃเตเดŸเต.

เดชเดฆเตเดงเดคเดฟเด•เตพ

เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟ เด•เตเดฒเต‹เตบ เดšเต†เดฏเตเดค เดถเต‡เดทเด‚, เดจเดฟเด™เตเด™เตพ เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดซเต‹เตพเดกเตผ เด˜เดŸเดจ เด•เดพเดฃเตเด‚.

โ”œโ”€โ”€ boot-flyway-v1              - 1.0.0 version of the app with v1 of the schema
โ”œโ”€โ”€ boot-flyway-v2              - 2.0.0 version of the app with v2 of the schema (backward-compatible - app can be rolled back)
โ”œโ”€โ”€ boot-flyway-v2-bad          - 2.0.0.BAD version of the app with v2bad of the schema (backward-incompatible - app cannot be rolled back)
โ”œโ”€โ”€ boot-flyway-v3              - 3.0.0 version of the app with v3 of the schema (app can be rolled back)
โ””โ”€โ”€ boot-flyway-v4              - 4.0.0 version of the app with v4 of the schema (app can be rolled back)

เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เตพ

เดšเตเดตเดŸเต†เดฏเตเดณเตเดณ เดธเตโ€Œเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เดณเดฟเตฝ เดตเดฟเดตเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เดธเตโ€Œเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เตพ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚, เด…เดคเต เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเตฝ เดชเดฟเดจเตเดจเดพเด•เตเด•-เด…เดจเตเดฏเต‹เดœเตเดฏเดตเตเด‚ เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดฒเตเดฒเดพเดคเตเดคเดคเตเดฎเดพเดฏ เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เด•เดพเดฃเดฟเด•เตเด•เตเด‚.

เด•เดพเดฃเดพเตป เดชเดฟเดจเตเดจเดฟเดฒเต‡เด•เตเด•เต เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดพเดฏ เดฎเดพเดฑเตเดฑเด™เตเด™เดณเตเดณเตเดณ เด•เต‡เดธเต, เดฑเตบ:

./scripts/scenario_backward_compatible.sh

เด•เดพเดฃเดพเดจเตเด‚ เดชเดฟเดจเตเดจเดฟเดฒเต‡เด•เตเด•เต เดชเตŠเดฐเตเดคเตเดคเดชเตเดชเต†เดŸเดพเดคเตเดค เดฎเดพเดฑเตเดฑเด™เตเด™เดณเตเดณเตเดณ เด•เต‡เดธเต, เดฑเตบ:

./scripts/scenario_backward_incompatible.sh

เดธเตเดชเตเดฐเดฟเด‚เด—เต เดฌเต‚เดŸเตเดŸเต เดธเดพเดฎเตเดชเดฟเตพ เดซเตเดฒเตˆเดตเต‡

เดŽเดฒเตเดฒเดพ เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เดณเตเด‚ เดŽเดŸเตเดคเตเดคเดคเดพเดฃเต Spring Boot Sample Flyway.

เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด’เดจเตเดจเต เดจเต‹เด•เตเด•เดพเดตเตเดจเตเดจเดคเดพเดฃเต http://localhost:8080/flyway, เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เดณเตเดŸเต† เด’เดฐเต เดฒเดฟเดธเตเดฑเตเดฑเต เด‰เดฃเตเดŸเต.

เดˆ เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเตฝ H2 เด•เตบเดธเต‹เดณเตเด‚ เด‰เตพเดชเตเดชเต†เดŸเตเดจเตเดจเต (at http://localhost:8080/h2-console) เด…เดคเดฟเดจเดพเตฝ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดจเดฟเดฒ เด•เดพเดฃเดพเดจเดพเด•เตเด‚ (เดกเดฟเดซเต‹เตพเดŸเตเดŸเต jdbc URL เด†เดฃเต jdbc:h2:mem:testdb).

เด…เดงเดฟเด•เดฎเดพเดฏเดฟ

เดžเด™เตเด™เดณเตเดŸเต† เดฌเตเดฒเต‹เด—เดฟเดฒเต† เดฎเดฑเตเดฑเต เดฒเต‡เด–เดจเด™เตเด™เดณเตเด‚ เดตเดพเดฏเดฟเด•เตเด•เตเด•:

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•