| PostgreSQL 8.3.3¹®¼ | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 35. ·ê ½Ã½ºÅÛ | Fast Forward | Next |
PostgreSQL¿¡ ÀÖ¾î¼ÀÇ ºä´Â ·ê ½Ã½ºÅÛÀ» »ç¿ëÇØ ±¸ÇöµÇ°í ÀÖ½À´Ï´Ù. ½ÇÁ¦,
CREATE VIEW myview AS SELECT * FROM mytab;
°úÀÇ 2°³ÀÇ ¸í·ÉÀÇ »çÀÌ¿¡´Â ±âº»ÀûÀÎ Â÷ÀÌ´Â ¾ø½À´Ï´Ù.
CREATE TABLE myview (
same column list as mytab
);
CREATE RULE "_RETURN" AS ON SELECT TO myview DO INSTEAD
SELECT * FROM mytab;
ÀÌ·¸°Ô ¸»ÇÏ´Â °ÍÀº, CREATE VIEW¸í·É¿¡ ÀÇÇØ ³»ºÎÀûÀ¸·Î ¿ÏÀüÈ÷ °°Àº ¸í·ÉÀ» Çϱ⠶§¹®ÀÔ´Ï´Ù. ±×·¯³ª ºÎÀÛ¿ëµµ ÀÖ½À´Ï´Ù. ±× ÇÑ °¡Áö´Â PostgreSQL½Ã½ºÅÛ ¸ñ·ÏÀÇ ºä¿¡ ´ëÇÑ Á¤º¸´Â Å×À̺íÀÇ Á¤º¸¿Í µ¿ÀÏÇØ¼, ÆÄ¼¿¡ À־µ Å×À̺í°ú ºä´Â °°Àº °ÍÀÌ µÈ´Ù´Â °ÍÀÔ´Ï´Ù. À̰͵éÀº °°Àº °Í, Áï ¸±·¹À̼ÇÀÔ´Ï´Ù.
ºñ·Ï ¸í·ÉÀÌ INSERT, UPDATE, DELETEµîÀ̾, ON SELECT·êÀº ¸ðµç Äõ¸®¿¡ ´ëÇØ ¸¶Áö¸·¿¡ Àû¿ëµË´Ï´Ù. ±×¸®°í, ÀÌ ·êÀº ´Ù¸¥ ¸í·É Á¾·ùÀÇ ·ê°ú ´Ù¸¥ Àǹ̷ÐÀ» °¡Áö°í ÀÖ¾î, Ä÷ Æ®¸®¸¦ ½Å±Ô¿¡ »ý¼ºÇÏÁö ¾Ê°í, ±× °÷¿¡ ÀÖ´Â °ÍÀ» ¼öÁ¤ÇÕ´Ï´Ù. µû¶ó¼ SELECT·êÀÌ Á¦ÀÏ Ã³À½¿¡ ±â¼úµÇÁö ¾ÊÀ¸¸é ¾ÈµË´Ï´Ù.
ÇöÀç·Î¼´Â, ON SELECT·ê¿¡¼´Â 1°³ÀÇ ¾×¼Ç ¹Û¿¡ Çã¿ëµÇÁö ¾Ê°í, ±×°ÍÀº INSTEADÀÎ ¹«Á¶°ÇÀÇ SELECT¾×¼ÇÀÌ ¾Æ´Ï¸é ¾ÈµË´Ï´Ù. ÀÌ Á¦¾àÀº, ÀϹÝÀÇ »ç¿ëÀÚ°¡ ¹«¾ùÀ» ÇØµµ, ·ê ½Ã½ºÅÛÀÌ °ß·ÚÇϱ⠶§¹®¿¡ ÇÊ¿äÇϰí, ON SELECTÀÇ ·êÀº ºä °°Àº µ¿ÀÛÀ¸·Î ÇÑÁ¤µË´Ï´Ù.
º»ÀåÀÇ ¿¹·Î¼ µé°í ÀÖ´Â °ÍÀº, ¾à°£ÀÇ ¿¬»êÀ» ÇÏ´Â 2°³ÀÇ °áÇÕÀÇ ºä¿Í ´ÙÀ½¿¡ ÀÌ·¯ÇÑ ±â´ÉÀ» ÀÌ¿ëÇÏ´Â ¸î°³ÀÇ ºäÀÔ´Ï´Ù. ÃÖÁ¾ °á°ú°¡ ¾î¶°ÇÑ ¸¶¹ýÀÇ ±â´É¿¡ ÀÇÇØ ¸¶Ä¡ ½ÇÁ¦ Å×À̺í°ú °°ÀÌ ÇൿÇÏ´Â ºä°¡ µÇµµ·Ï, óÀ½ÀÇ 2°³ÀÇ ºä °¡¿îµ¥ Çϳª´Â, INSERT, UPDATE, DELETEÁ¶ÀÛ¿¡ ´ëÇÑ ·êÀ» ´ÙÀ½¿¡ Ãß°¡ÇÏ´Â °ÍÀ¸·Î Ä¿½ºÅ͸¶ÀÌÁî µË´Ï´Ù. óÀ½À¸·Î ¹è¿ì±â À§ÇÑ ¿¹·Î¼´Â °áÄÚ °£´ÜÇÏÁö ¾Ê°í ¸ÕÀú ÁøÇàµÇ´Â °ÍÀ» ¾î·Æ°Ô ÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ¸¹Àº ´Ù¸¥ ¿¹¸¦ ²¨³» ¸Ó¸®¼ÓÀ» È¥¶õ½ÃŰ´Â °Í´Ùµµ, ¸ðµç ³íÁ¡À» ´Ü°è¸¶´Ù ÂÑ´Â 1°³ÀÇ ¿¹¸¦ µå´Â ÆíÀÌ ÁÁÀ» °ÍÀÔ´Ï´Ù.
ÀÌ ¿¹¿¡¼´Â, 2°³ÀÇ Á¤¼ö·ÎºÎÅÍ ÀÛÀº °ªÀ» µ¹·ÁÁÖ´Â ¾à°£ÀÇ minÇÔ¼ö¸¦ ÇÊ¿ä·Î ÇÕ´Ï´Ù. ÇÔ¼öÀÇ »ý¼ºÀº ÀÌÇÏ¿Í °°ÀÌ ÇÕ´Ï´Ù.
CREATE FUNCTION min(integer, integer) RETURNS integer AS $$
SELECT CASE WHEN $1 < $2 THEN $1 ELSE $2 END
$$ LANGUAGE SQL STRICT;
ÃÖÃÊÀÇ µÎ °³ÀÇ ·ê ½Ã½ºÅÛÀÇ ¼³¸í¿¡ ÇÊ¿ä·Î ÇÏ´Â ½ÇÁ¦ Å×À̺íÀ» ÀÌÇÏ¿¡ ³ªÅ¸³À´Ï´Ù.
CREATE TABLE shoe_data (
shoename text, -- ÁÖŰ
sh_avail integer, -- Àç°í
slcolor text, -- °¡´ÉÇÑ ½Å¹ß²öÀÇ »ö
slminlen real, -- ½Å¹ß²öÀÇ ÃÖ´Ü »çÀÌÁî
slmaxlen real, -- ½Å¹ß²öÀÇ ÃÖÀå »çÀÌÁî
slunit text -- ±æÀÌÀÇ ´ÜÀ§
);
CREATE TABLE shoelace_data (
sl_name text, -- ÁÖŰ
sl_avail integer, -- Àç°í
sl_color text, -- ½Å¹ß²öÀÇ »ö
sl_len real, -- ½Å¹ß²öÀÇ ±æÀÌ
sl_unit text -- ±æÀÌÀÇ ´ÜÀ§
);
CREATE TABLE unit (
un_name text, -- ÁÖ Å°
un_fact real -- cm·Î º¯È¯ÇÏ´Â ÆÑÅÍ
);
º¸ÀÌ´Â °Íó·³, À̰͵éÀº ½Å¹ß°¡°ÔÀÇ µ¥ÀÌÅ͸¦ ³ªÅ¸³»°í ÀÖ½À´Ï´Ù.
ºä¸¦ ÀÌÇÏ¿Í °°ÀÌ ÀÛ¼ºÇÕ´Ï´Ù.
CREATE VIEW shoe AS
SELECT sh.shoename,
sh.sh_avail,
sh.slcolor,
sh.slminlen,
sh.slminlen * un.un_fact AS slminlen_cm,
sh.slmaxlen,
sh.slmaxlen * un.un_fact AS slmaxlen_cm,
sh.slunit
FROM shoe_data sh, unit un
WHERE sh.slunit = un.un_name;
CREATE VIEW shoelace AS
SELECT s.sl_name,
s.sl_avail,
s.sl_color,
s.sl_len,
s.sl_unit,
s.sl_len * u.un_fact AS sl_len_cm
FROM shoelace_data s, unit u
WHERE s.sl_unit = u.un_name;
CREATE VIEW shoe_ready AS
SELECT rsh.shoename,
rsh.sh_avail,
rsl.sl_name,
rsl.sl_avail,
min(rsh.sh_avail, rsl.sl_avail) AS total_avail
FROM shoe rsh, shoelace rsl
WHERE rsl.sl_color = rsh.slcolor
AND rsl.sl_len_cm >= rsh.slminlen_cm
AND rsl.sl_len_cm <= rsh.slmaxlen_cm;
shoelaceºä(Áö±Ý ÀÖ´Â Á¦ÀÏ °£´ÜÇÑ ºä)¿ëÀÇ CREATE VIEW¸í·ÉÀº, shoelace¸±·¹À̼ÇÀ» Äõ¸® ¹üÀ§ Å×À̺í Áß¿¡¼ shoelace¸±·¹À̼ÇÀÌ ÂüÁ¶µÉ ¶§´Â ¾ðÁ¦¶óµµ Àû¿ëµÇ¾î¾ß ÇÒ ÀçÀÛ¼º ·êÀÇ Á¸À縦 ³ªÅ¸³»´Â Ç׸ñÀ» pg_rewrite¿¡ ¸¸µì´Ï´Ù. ·êÀº ·ê Á¶°Ç(SELECT·êÀº ÇöÀç °¡Áú ¼ö ¾ø±â ¶§¹®¿¡, ºñSELECT·ê¿¡¼ ´Ù·ì´Ï´Ù)À» °¡ÁöÁö ¾Ê´Â INSTEADÀÔ´Ï´Ù. ·ê Á¶°ÇÀº Äõ¸® Á¶°Ç°ú´Â ´Ù¸¥ °Í¿¡ ÁÖÀÇÇØ ÁÖ¼¼¿ä! ·ê µ¿ÀÛÀº Äõ¸® Á¶°ÇÀ» °¡Áö°í ÀÖ½À´Ï´Ù. ÀÌ ·ê µ¿ÀÛÀº, ºä ÀÛ¼º ¸í·É³»ÀÇ SELECT¸í·É¹®ÀÇ º¹»çÀÎ, 1°³ÀÇ Äõ¸® Æ®¸®ÀÔ´Ï´Ù.
Note: pg_rewriteÇ׸ñÀÇ NEW¿Í OLD (¿ª»çÀûÀÎ ÀÌÀ¯¿¡ ÀÇÇØ, Ãâ·Â¿ëÀÇ Äõ¸® Æ®¸®¿¡¼, *NEW*³ª *CURRENT*¶ó´Â À̸§ÀÌ ºÙ¾î ÀÖ½À´Ï´Ù)¿¡ ´ëÇÑ 2°³ÀÇ Æ¯º°ÇÑ ¹üÀ§ Å×À̺í Ç׸ñÀº SELECT·ê °ú´Â °ü°è°¡ ¾ø½À´Ï´Ù.
±×·³ ¿©±â¼ unit shoe_data, shoelace_data¿¡ µ¥ÀÌÅ͸¦ ³Ö¾î ºä¿¡ °£´ÜÇÑ Äõ¸®¸¦ ½Ç½ÃÇÕ´Ï´Ù.
INSERT INTO unit VALUES ('cm', 1.0);
INSERT INTO unit VALUES ('m', 100.0);
INSERT INTO unit VALUES ('inch', 2.54);
INSERT INTO shoe_data VALUES ('sh1', 2, 'black', 70.0, 90.0, 'cm');
INSERT INTO shoe_data VALUES ('sh2', 0, 'black', 30.0, 40.0, 'inch');
INSERT INTO shoe_data VALUES ('sh3', 4, 'brown', 50.0, 65.0, 'cm');
INSERT INTO shoe_data VALUES ('sh4', 3, 'brown', 40.0, 50.0, 'inch');
INSERT INTO shoelace_data VALUES ('sl1', 5, 'black', 80.0, 'cm');
INSERT INTO shoelace_data VALUES ('sl2', 6, 'black', 100.0, 'cm');
INSERT INTO shoelace_data VALUES ('sl3', 0, 'black', 35.0 , 'inch');
INSERT INTO shoelace_data VALUES ('sl4', 8, 'black', 40.0 , 'inch');
INSERT INTO shoelace_data VALUES ('sl5', 4, 'brown', 1.0 , 'm');
INSERT INTO shoelace_data VALUES ('sl6', 0, 'brown', 0.9 , 'm');
INSERT INTO shoelace_data VALUES ('sl7', 7, 'brown', 60 , 'cm');
INSERT INTO shoelace_data VALUES ('sl8', 1, 'brown', 40 , 'inch');
SELECT * FROM shoelace;
sl_name | sl_avail | sl_color | sl_len | sl_unit | sl_len_cm
-----------+----------+----------+--------+---------+-----------
sl1 | 5 | black | 80 | cm | 80
sl2 | 6 | black | 100 | cm | 100
sl7 | 7 | brown | 60 | cm | 60
sl3 | 0 | black | 35 | inch | 88.9
sl4 | 8 | black | 40 | inch | 101.6
sl8 | 1 | brown | 40 | inch | 101.6
sl5 | 4 | brown | 1 | m | 100
sl6 | 0 | brown | 0.9 | m | 90
(8 rows)
À̰ÍÀº, ºä¿¡ ´ëÇÑ °¡Àå °£´ÜÇÑ SELECTÀ̹ǷÎ, ÀÌ ±âȸ¿¡ ºä ·êÀÇ ±âº»À» ¼³¸íÇÕ´Ï´Ù. SELECT * FROM shoelace´Â ÆÄ¼¿¡ ÀÇÇØ ó¸®µÇ¾î ´ÙÀ½ÀÇ Äõ¸® Æ®¸®°¡ »ý¼ºµË´Ï´Ù.
SELECT shoelace.sl_name, shoelace.sl_avail,
shoelace.sl_color, shoelace.sl_len,
shoelace.sl_unit, shoelace.sl_len_cm
FROM shoelace shoelace;
ÀÌ Æ®¸®°¡ ·ê ½Ã½ºÅÛ¿¡ ÀüÇØÁý´Ï´Ù. ·ê ½Ã½ºÅÛÀº ¹üÀ§ Å×À̺íÀ» ÂüÁ¶ÇØ, ¸±·¹À̼ǿ¡ ´ëÇØ¼ ·êÀÌ Á¸ÀçÇÏ´ÂÁö Á¶»çÇÕ´Ï´Ù. shoelace(Çö½ÃÁ¡¿¡¼´Â À¯ÀÏÇÑ ºä)¿¡ ´ëÇÑ ¹üÀ§ Å×À̺í Ç׸ñÀ» ó¸®ÇÒ ¶§, Äõ¸® Æ®¸®·Î _RETURN·êÀ» °ËÃâÇÕ´Ï´Ù.
SELECT s.sl_name, s.sl_avail,
s.sl_color, s.sl_len, s.sl_unit,
s.sl_len * u.un_fact AS sl_len_cm
FROM shoelace *OLD*, shoelace *NEW*,
shoelace_data s, unit u
WHERE s.sl_unit = u.un_name;
ºä¸¦ Àü°³Çϱâ À§Çؼ, ÀçÀÛ¼ºÀº ´Ü¼øÇÏ°Ô ·êÀÇ µ¿ÀÛ Äõ¸® Æ®¸®¸¦ °¡Áö´Â ¼ºêÄõ¸® ¹üÀ§ Å×À̺íÀÇ Ç׸ñÀ» ¸¸µé¾î, ºä¸¦ ÂüÁ¶Çϰí ÀÖ´ø º»·¡ ¹üÀ§ Å×À̺íÀ» ¿Å°Ü³õ½À´Ï´Ù. ÀçÀÛ¼ºµÈ °á°úÀÇ Äõ¸® Æ®¸®´Â, ÀÌÇÏ¿Í °°ÀÌ ÀÔ·ÂÇßÀ» °æ¿ì¿Í °ÅÀÇ °°½À´Ï´Ù.
SELECT shoelace.sl_name, shoelace.sl_avail,
shoelace.sl_color, shoelace.sl_len,
shoelace.sl_unit, shoelace.sl_len_cm
FROM (SELECT s.sl_name,
s.sl_avail,
s.sl_color,
s.sl_len,
s.sl_unit,
s.sl_len * u.un_fact AS sl_len_cm
FROM shoelace_data s, unit u
WHERE s.sl_unit = u.un_name) shoelace;
±×·¯³ª ÇÑ °¡ÁöÀÇ Â÷À̰¡ ÀÖ½À´Ï´Ù. ¼ºêÄõ¸®ÀÇ ¹üÀ§ Å×À̺íÀÌ 2 °³ÀÇ Ãß°¡ Ç׸ñ shoelace *OLD*¿Í shoelace *NEW*¸¦ °¡Áö°í ÀÖ´Â °ÍÀÔ´Ï´Ù. ÀÌ·¯ÇÑ Ç׸ñÀº ¼ºêÄõ¸®ÀÇ °áÇÕ Æ®¸®³ª ´ë»ó ¸®½ºÆ®·Î ÂüÁ¶µÇÁö ¾ÊÀ¸¹Ç·Î, Á÷Á¢ Äõ¸®¿¡¼´Â »ç¿ëµÇÁö ¾Ê½À´Ï´Ù. ÀçÀÛ¼ºÀº ±×°ÍµéÀ» »ç¿ëÇØ, ºä¸¦ ÂüÁ¶ÇÑ ¹üÀ§ Å×À̺íÀÇ Ç׸ñ¿¡ ¿ø·¡ Á¸ÀçÇÑ Á¢±Ù±ÇÇÑ È®ÀÎ Á¤º¸¸¦ ÀúÀåÇÕ´Ï´Ù. ÀÌ ¹æ¹ýÀ¸·Î, ÀçÀÛ¼ºµÈ Äõ¸®¿¡¼ Á÷Á¢ ºä¸¦ »ç¿ëÇϰí ÀÖÁö ¾Ê¾Æµµ, ÁýÇàÀÚ´Â »ç¿ëÀÚ°¡ ±× ºä¿¡ Á¢±ÙÇϱâ À§ÇÑ ¿Ã¹Ù¸¥ ±ÇÇÑÀ» °¡Áö°í ÀÖ´ÂÁö È®ÀÎÇÕ´Ï´Ù.
À̰ÍÀÌ ÃÖÃÊ·Î Àû¿ëµÇ´Â ·êÀÔ´Ï´Ù. ·ê ½Ã½ºÅÛÀº ÃÖ»óÁ¤µµÀÇ Äõ¸®ÀÇ ³ª¸ÓÁö(ÀÌ ¿¹¿¡¼´Â ´õ ÀÌ»ó ¾ø½À´Ï´Ù)ÀÇ ¹üÀ§ Å×À̺íÀÇ Ç׸ñÀ» °è¼Ó üũÇÕ´Ï´Ù. ±×¸®°í ·ê ½Ã½ºÅÛÀº, Ãß°¡µÈ ¼ºêÄõ¸®ÀÇ ¹üÀ§ Å×À̺í Ç׸ñÀÌ ºä¸¦ ÂüÁ¶ÇÒÁö¸¦ ¹Ýº¹ÀûÀ¸·Î È®ÀÎÇÕ´Ï´Ù (±×·¯³ª *OLD*³ª *NEW*´Â Àü°³ÇÏÁö ¾Ê½À´Ï´Ù. ±×·¸Áö ¾ÊÀ¸¸é ¹«ÇÑ ¹Ýº¹ÀÌ µÇ¾î ¹ö¸³´Ï´Ù! ). ÀÌ ¿¹¿¡¼´Â shoelace_data³ª unit¿ëÀÇ ÀçÀÛ¼º ·êÀº ¾ø½À´Ï´Ù. µû¶ó¼, ÀçÀÛ¼ºÀÌ ¿Ï°áµÇ°í, »ó±â°¡ Ç÷¡³Ê¿¡°Ô °Ç³×Áö´Â ÃÖÁ¾ÀûÀÎ °á°ú°¡ µË´Ï´Ù.
±×·±µ¥, °¡°Ô¿¡ ³õ¿©Á® ÀÖ´Â ½Å¹ß²ö(ÀÇ »ö°ú »çÀÌÁî)¿¡ ÀÏÄ¡ÇÏ´Â ±¸µÎ°¡ °¡°Ô¿¡ ÀÖ´ÂÁö, ¿ÏÀüÇÏ°Ô ÀÏÄ¡ÇÏ´Â ½Å¹ß²öÀÇ Àç°í¼ö°¡ 2ÀÌ»ó ÀÖÀ»Áö ¾øÀ»Áö¸¦ ÆÄ¾ÇÇÏ´Â Äõ¸®¸¦ ½á º¾½Ã´Ù.
SELECT * FROM shoe_ready WHERE total_avail >= 2; shoename | sh_avail | sl_name | sl_avail | total_avail ----------+----------+---------+----------+------------- sh1 | 2 | sl1 | 5 | 2 sh3 | 4 | sl7 | 7 | 4 (2 rows)
À̹ø ÆÄ¼ÀÇ Ãâ·ÂÀº ÀÌÇÏÀÇ Äõ¸® Æ®¸®ÀÔ´Ï´Ù.
SELECT shoe_ready.shoename, shoe_ready.sh_avail,
shoe_ready.sl_name, shoe_ready.sl_avail,
shoe_ready.total_avail
FROM shoe_ready shoe_ready
WHERE shoe_ready.total_avail >= 2;
ÃÖÃÊ·Î Àû¿ëµÇ´Â ·êÀº shoe_readyºä¿ëÀÇ °ÍÀ¸·Î, Äõ¸® Æ®¸®¿¡ ÀÖ¾î¼ÀÇ °á°ú´Â ÀÌÇϸ® °°ÀÌ µË´Ï´Ù.
SELECT shoe_ready.shoename, shoe_ready.sh_avail,
shoe_ready.sl_name, shoe_ready.sl_avail,
shoe_ready.total_avail
FROM (SELECT rsh.shoename,
rsh.sh_avail,
rsl.sl_name,
rsl.sl_avail,
min(rsh.sh_avail, rsl.sl_avail) AS total_avail
FROM shoe rsh, shoelace rsl
WHERE rsl.sl_color = rsh.slcolor
AND rsl.sl_len_cm >= rsh.slminlen_cm
AND rsl.sl_len_cm <= rsh.slmaxlen_cm) shoe_ready
WHERE shoe_ready.total_avail >= 2;
¸¶Âù°¡Áö·Î, shoe¿Íshoelace¿ëÀÇ ·êÀº ¼ºêÄõ¸®ÀÇ ¹üÀ§ Å×À̺í·Î¼ ´ë¿ëµÇ¾î 3 ·¹º§ÀÇ ÃÖÁ¾ Äõ¸® Æ®¸®·Î À̲ü´Ï´Ù.
SELECT shoe_ready.shoename, shoe_ready.sh_avail,
shoe_ready.sl_name, shoe_ready.sl_avail,
shoe_ready.total_avail
FROM (SELECT rsh.shoename,
rsh.sh_avail,
rsl.sl_name,
rsl.sl_avail,
min(rsh.sh_avail, rsl.sl_avail) AS total_avail
FROM (SELECT sh.shoename,
sh.sh_avail,
sh.slcolor,
sh.slminlen,
sh.slminlen * un.un_fact AS slminlen_cm,
sh.slmaxlen,
sh.slmaxlen * un.un_fact AS slmaxlen_cm,
sh.slunit
FROM shoe_data sh, unit un
WHERE sh.slunit = un.un_name) rsh,
(SELECT s.sl_name,
s.sl_avail,
s.sl_color,
s.sl_len,
s.sl_unit,
s.sl_len * u.un_fact AS sl_len_cm
FROM shoelace_data s, unit u
WHERE s.sl_unit = u.un_name) rsl
WHERE rsl.sl_color = rsh.slcolor
AND rsl.sl_len_cm >= rsh.slminlen_cm
AND rsl.sl_len_cm <= rsh.slmaxlen_cm) shoe_ready
WHERE shoe_ready.total_avail > 2;
´ÙÀ½¿¡ Ç÷¡³Ê´Â ÀÌ Æ®¸®¸¦ 2 ·¹º§ÀÇ Äõ¸® Æ®¸®·Î ÁÙÀÔ´Ï´Ù. ¸Ç ¹ØÀÇ SELECT¸í·ÉÀº µû·Î µû·Î ó¸®ÇÒ Çʿ䰡 ¾ø±â ¶§¹®¿¡, 2¹øÂ°ÀÇ SELECT¿¡ "²ø¾î¿É´Ï´Ù". ±×·¯³ª 2¹øÂ°ÀÇ SELECT´Â Áý°è ÇÔ¼ö¸¦ °¡Áö±â ¶§¹®¿¡, Á¤Á¡À¸·ÎºÎÅÍ´Â ±¸º°µË´Ï´Ù. ¸¸¾à ±×°ÍµéÀ» ²ø¾î¿À°ÔµÇ¸é ¸Ç À§ÀÇ SELECTÀÇ µ¿ÀÛÀ» ¹Ù²Ù°Ô µÇ´Âµ¥, ±×°ÍÀ» ¿øÄ¡´Â ¾Ê½À´Ï´Ù. ±×·¯³ª, Äõ¸® Æ®¸®¸¦ ÁÙÀÌ´Â ÃÖÀûȸ¦, ÀçÀÛ¼º ½Ã½ºÅÛ ÀÚ½ÅÀ¸·Î ÀǽÄÇÒ ÇÊ¿ä´Â ¾ø½À´Ï´Ù.
Áö±Ý±îÁöÀÇ ºä ·êÀÇ ¼³¸í¿¡¼´Â Äõ¸® Æ®¸®ÀÇ 2°¡Áö ¼¼ºÎ»çÇ׿¡ ´ëÇÏ¿© ´Ù·çÁö ¾Ê¾Ò½À´Ï´Ù. ±×°ÍµéÀº, ¸í·É ŸÀÔ°ú °á°ú ¸±·¹À̼ÇÀÔ´Ï´Ù. ½ÇÁ¦, ºä ·ê´Â ÀÌ·¯ÇÑ Á¤º¸¸¦ ÇÊ¿ä·Î ÇÏÁö ¾Ê½À´Ï´Ù.
SELECT¿Í ´Ù¸¥ ¸í·É¿¡ ´ëÇÑ Äõ¸® Æ®¸®ÀÇ »çÀÌ¿¡´Â Å« Â÷ÀÌ´Â ¾ø½À´Ï´Ù. ±×°ÍµéÀº ºÐ¸íÇÏ°Ô ´Ù¸¥ ¸í·ÉÇüÀ» °¡Áö°í ÀÖ¾î, SELECTÀÌ¿ÜÀÇ ¸í·É¿¡¼, °á°ú ¸±·¹À̼ÇÀº °á°úÀÇ ÀúÀå¼Ò°¡ µÇ´Â ¹üÀ§ Å×À̺íÀÇ Ç׸ñÀ» Áö½ÃÇÕ´Ï´Ù. ±× À̿ܿ¡´Â ¿ÏÀüÈ÷ °°½À´Ï´Ù. µû¶ó¼, a¿Í bÀÇ ¿À» °¡Áö´Â Å×À̺ít1, t2¿¡ ´ëÇÑ ÀÌÇÏÀÇ 2°³ÀÇ ¸í·É¹®ÀÇ Äõ¸® Æ®¸®´Â, °ÅÀÇ °°½À´Ï´Ù.
SELECT t2.b FROM t1, t2 WHERE t1.a = t2.a; UPDATE t1 SET b = t2.b FROM t2 WHERE t1.a = t2.a;
ÀÌÇÏ¿¡, ±¸Ã¼ÀûÀ¸·Î °¡¸®Åµ´Ï´Ù.
¹üÀ§ Å×ÀÌºí¿¡´Â, Å×À̺ít1¿Í t2¿¡ ´ëÇÑ Ç׸ñÀÌ ÀÖ½À´Ï´Ù.
´ë»ó ¸®½ºÆ®¿¡´Â Å×À̺ít2¿¡ ´ëÇÑ ¹üÀ§ Å×À̺í Ç׸ñÀÇ b¿À» Áö½ÃÇÏ´Â 1°³ÀÇ º¯¼ö°¡ ÀÖ½À´Ï´Ù.
Á¶°Ç½ÄÀº, ¹üÀ§ Å×À̺íÀÇ ¾çÂÊ Ç׸ñÀÇ a¿ÀÇ µî°¡¼ºÀ» ºñ±³ÇÕ´Ï´Ù.
°áÇÕ Æ®¸®´Â t1¿Í t2ÀÇ ´Ü¼øÇÑ °áÇÕÀ» ³ªÅ¸³»°í ÀÖ½À´Ï´Ù.
°á°úÀûÀ¸·Î, ¾çÂÊ ¸ðµÎÀÇ Äõ¸® Æ®¸®´Â ºñ½ÁÇÑ ½ÇÇà °èȹÀÌ µË´Ï´Ù. ±×°ÍµéÀº 2°³ÀÇ Å×À̺íÀÇ °áÇÕÀÔ´Ï´Ù. UPDATE¿¡¼´Â t1·ÎºÎÅÍ ºüÁ® ÀÖ´Â ¿Àº Ç÷¡³Ê¿¡ ÀÇÇØ ´ë»ó ¸®½ºÆ®¿¡ Ãß°¡µÇ¾î, ÃÖÁ¾ÀÇ Äõ¸® Æ®¸®´Â ÀÌÇÏ¿Í °°ÀÌ µË´Ï´Ù.
UPDATE t1 SET a = t1.a, b = t2.b FROM t2 WHERE t1.a = t2.a;
±×¸®°í, °áÇÕÀ» ½ÇÇàÇÑ ÁýÇàÀÚÀÇ
SELECT t1.a, t2.b FROM t1, t2 WHERE t1.a = t2.a;
°á°ú ÁýÇÕ°ú ¿ÏÀüÈ÷ °°Àº °á°ú ÁýÇÕÀ» ÀÛ¼ºÇÕ´Ï´Ù. ±×·¯³ª UPDATE¿¡ ¾à°£ÀÇ ¹®Á¦°¡ ÀÖ½À´Ï´Ù. ÁýÇàÀÚ´Â, °áÇÕÀÌ ½Ç½ÃÇϴ ó¸®ÀÇ °á°ú°¡ ¹«¾ùÀ» ÀǹÌÇϰí ÀÖ´ÂÁö °ü¿©ÇÏÁö ¾Ê½À´Ï´Ù. ÁýÇàÀÚ´Â ´ÜÁö °á°ú°¡ µÇ´Â ÇàÀÇ ÁýÇÕÀ» ÀÛ¼ºÇÒ »ÓÀÔ´Ï´Ù. Çϳª´Â SELECT¸í·É, ´Ù¸¥ Çϳª´Â UPDATE¸í·ÉÀÎ °ÍÀÇ Â÷ÀÌ´Â, ÁýÇàÀÚ¸¦ È£ÃâÇÏ´Â Ãø¿¡¼ ´Ù·ç¾îÁý´Ï´Ù. È£Ãâ ÃøÀº(Äõ¸® Æ®¸®¸¦ º¸¸é), À̰ÍÀÌ UPDATEÀÎ °ÍÀ» ¾Ë°í ÀÖ¾î, ÀÌ °á°ú°¡ Å×À̺ít1¿¡ µé¾î°¡Áö ¾ÊÀ¸¸é ¾È µÇ´Â °ÍÀ» ¾Ë°í ÀÖ½À´Ï´Ù. ±×·¯³ª, ¾î¶² ÇàÀÌ »õ·Î¿î Çà¿¡ ÀÇÇØ ġȯµÇ¾î¾ß¸¸ ÇÏ´Â °ÍÀϱî¿ä?
ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇØ, UPDATE¹®(DELETE¹®ÀÇ °æ¿ìµµ ¸¶Âù°¡Áö)ÀÇ ´ë»ó ¸®½ºÆ®¿¡ ´Ù¸¥ Ç׸ñÀ» µ¡ºÙÀÏ ¼ö ÀÖ½À´Ï´Ù. ±×°ÍÀº, ÇöÀçÀÇ Å¸Ç® ID(CTID)ÀÔ´Ï´Ù. À̰ÍÀº ±× ÇàÀÇ ÆÄÀÏ ºí·Ï ¹øÈ£¿Í ºí·Ï »óÀÇ À§Ä¡¸¦ °¡Áö´Â ½Ã½ºÅÛ¿ÀÔ´Ï´Ù. Å×À̺íÀ» ¾Ë°í ÀÖ´Â °æ¿ì, CTID¸¦ »ç¿ëÇØ, º»·¡ÀÇ t1ÇàÀ» ÃßÃâÇØ °»½ÅÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. CTID¸¦ ´ë»ó ¸®½ºÆ®¿¡ Ãß°¡Çϸé, Äõ¸®´Â ÀÌÇÏ¿Í °°ÀÌ µË´Ï´Ù.
SELECT t1.a, t2.b, t1.ctid FROM t1, t2 WHERE t1.a = t2.a;
±×·³, PostgreSQLÀÇ ´Ù¸¥ »ó¼¼ ¼³¸í¿¡ µé¾î°©´Ï´Ù. Å×À̺íÀÇ ÇàÀº µ¡¾²±âµÇÁö ¾ÊÀ¸¹Ç·Î, ROLLBACK󸮴 ºü¸¨´Ï´Ù. UPDATE¿¡¼´Â, (CTID¸¦ ¾ø¾Ø ÈÄ) Å×ÀÌºí¿¡ »õ·Î¿î °á°úÇàÀÌ »ðÀԵǾî CTID°¡ Áö½ÃÇÏ´Â ¿À·¡µÈ ÇàÀÇ Çà Çì´õ ³»ÀÇ cmax¿Í xmaxÇ׸ñÀº ÇöÀçÀÇ ¸í·É Ä«¿îÅÍ¿Í ÇöÀçÀÇ Æ®·£Àè¼Ç ID·Î ¼³Á¤µË´Ï´Ù. ÀÌ¿Í °°ÀÌ ÇØ, ¿À·¡µÈ ÇàÀº ¼û°ÜÁ® Æ®·£Àè¼ÇÀÌ Ä¿¹ÔµÈ ÈÄ, Áø°øÃ»¼Ò±â(vacuum cleaner)¿¡ ÀÇÇØ ½ÇÁ¦·Î »èÁ¦ÇÒ ¼ö ÀÖ½À´Ï´Ù.
ÀÌ·¯ÇÑ ¼¼ºÎ»çÇ×À» ÀüºÎ ÀÌÇØÇÒ ¼ö ÀÖÀ¸¸é, ¾î¶² ¸í·É¿¡ ´ëÇØ¼µµ ¿ÏÀüÈ÷ ¶È°°ÀÌ ÇØ, ºäÀÇ ·êÀ» °£´ÜÇÏ°Ô Àû¿ëÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. Â÷À̰¡ ¾ø½À´Ï´Ù.
¿©±â±îÁö, ·ê ½Ã½ºÅÛÀÌ ¾î¶»°Ô ºäÀÇ Á¤ÀǸ¦ ¿ø·¡ÀÇ Äõ¸® Æ®¸®¿¡ ÅëÇÕÇÏ´ÂÁö¸¦ ÇØ¼³Çß½À´Ï´Ù. µÎ¹øÂ° ¿¹¿¡¼´Â, 1°³ÀÇ ºä·ÎºÎÅÍÀÇ ´Ü¼øÇÑ SELECT¿¡ ÀÇÇØ, ÃÖÁ¾ÀûÀ¸·Î 4°³ÀÇ Å×À̺íÀ» °áÇÕÇÏ´Â Äõ¸® Æ®¸®°¡ »ý¼ºµÇ¾ú½À´Ï´Ù(unit´Â ´Ù¸¥ À̸§À¸·Î µÎ¹ø »ç¿ëµÇ¾ú½À´Ï´Ù).
ºä¸¦ ·ê ½Ã½ºÅÛÀ¸·Î ±¸ÇöÇÏ´Â ÀÌÁ¡Àº, ¾î´À Å×À̺íÀ» °Ë»öÇØ¾ßÇÒ °ÍÀΰ¡, ±×·¯ÇÑ Å×ÀÌºí°£ÀÇ °ü·Ã¼º, ºä·ÎºÎÅÍÀÇ Á¦¾à Á¶°Ç, º»·¡ÀÇ Äõ¸® Á¶°Ç¿¡ °üÇÑ Á¤º¸¸¦ ¸ðµÎ, Ç÷¡³Ê°¡ 1°³ÀÇ Äõ¸® Æ®¸®¾È¿¡ °¡Áö°í ÀÖ´Â °ÍÀÔ´Ï´Ù. º»·¡ÀÇ Äõ¸®°¡ ÀÌ¹Ì ºä¿¡ ´ëÇÑ °áÇÕÀÏ ¶§µµ °°½À´Ï´Ù. Ç÷¡³Ê´Â ¿©±â¼ ¾î¶² °ÍÀÌ Äõ¸® ó¸®ÀÇ ÃÖÀû °æ·ÎÀÎÁö¸¦ °áÁ¤ÇÏÁö ¾ÊÀ¸¸é ¾ÈµË´Ï´Ù. Ç÷¡³Ê´Â º¸°ü À¯ÁöÇÏ´Â Á¤º¸°¡ ¸¹À¸¸é ¸¹À»¼ö·Ï, º¸´Ù ÁÁÀº °áÁ¤À» ³»¸± ¼ö°¡ ÀÖ½À´Ï´Ù. ±×¸®°í PostgreSQL¿¡ ±¸ÇöµÇ°í ÀÖ´Â ·ê ½Ã½ºÅÛÀº, À̰ÍÀÌ Çö½ÃÁ¡¿¡¼ Á¦°øµÇ°í ÀÖ´Â ¸ðµç Á¤º¸ÀÓÀ» º¸ÁõÇÕ´Ï´Ù.
ºä°¡ INSERT, UPDATE, DELETEµîÀÇ ´ë»ó ¸±·¹À̼ÇÀ¸·Î¼ À̸§ÀÌ ºÙ¿©Á³À» °æ¿ì´Â ¾î¶»°Ô µÇ´Â °ÍÀϱî¿ä? À§¿¡¼ ¼³¸íÇÑ °Í °°Àº ġȯÀ» ÇÑ ÈÄ¿¡, °á°ú ¸±·¹À̼ÇÀÌ ¼ºêÄõ¸®ÀÇ ¹üÀ§ Å×À̺í Ç׸ñÀ» °¡¸®Å°´Â Äõ¸® Æ®¸®°¡ »ý±é´Ï´Ù. À̰ÍÀ» »ç¿ëÇÒ ¼ö ¾øÀ¸¹Ç·Î, ÀçÀÛ¼ºÀº ±×·¯ÇÑ °ÍÀÌ »ý¼ºµÈ °ÍÀ» ¾Ë¸é ¿¡·¯¸¦ ¹ß»ýÇÕ´Ï´Ù.
À̰ÍÀ» ¹Ù²Ù±â À§Çؼ, ÀÌ·¯ÇÑ Á¾·ùÀÇ ¸í·ÉÀÇ µ¿ÀÛÀ» ¹Ù²Ù´Â ·êÀ» Á¤ÀÇÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ±×°ÍÀÌ ´ÙÀ½ ¼½¼ÇÀÇ ³íÁ¦°¡ µË´Ï´Ù.