35.3. INSERT, UPDATE, DELETE¿¡ ´ëÇÑ ·ê

INSERT, UPDATE, DELETE¿¡ Á¤ÀÇÇÏ´Â ·êÀº ÀüÀý¿¡¼­ ÇØ¼³ÇÑ ºäÀÇ ·ê°ú´Â ¿ÏÀüÈ÷ ´Ù¸¨´Ï´Ù. ù°, ÀÌ·¯ÇÑ CREATE RULE¸í·É¿¡¼­´Â ÀÌÇϸ¦ ½Ç½ÃÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.

µÎ ¹øÂ°·Î, ±× °÷¿¡¼­ Äõ¸® Æ®¸®¸¦ º¯°æÇÏÁö ¾Ê½À´Ï´Ù. ±× ´ë½Å¿¡ ½Å±ÔÀÇ 0°³ ÀÌ»óÀÇ Äõ¸® Æ®¸®¸¦ »ý¼ºÇØ, ¿ø·¡ÀÇ °ÍÀ» ÆÄ±âÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.

35.3.1. ·êÀÇ °»½Å µ¿ÀÛ

±¸¹®ÀÌ °è¼ÓµË´Ï´Ù.

CREATE [ OR REPLACE ] RULE 
name
 AS ON 
event

    TO 
table
 [ WHERE 
condition
 ]
    DO [ ALSO | INSTEAD ] { NOTHING | 
command
 | ( 
command
 ; 
command
 ... ) }

»ó±âÀÇ ±¸¹®À» ±â¾ïÇØ ÁÖ¼¼¿ä. ÀÌÇÏ¿¡¼­´Â, °»½Å ·êÀº INSERT, UPDATE, DELETE¿¡ Á¤ÀÇµÈ ·êÀ» ÀǹÌÇÕ´Ï´Ù.

°»½Å ·êÀº, Äõ¸® Æ®¸®ÀÇ °á°ú ¸±·¹À̼ǰú ¸í·É Á¾·ù°¡ CREATE RULE·Î ÁÖ¾îÁö´Â °´Ã¼¿Í À̺¥Æ®¿Í µ¿ÀÏÇÑ °æ¿ì¿¡ ·ê ½Ã½ºÅÛ¿¡ ÀÇÇØ Àû¿ëµË´Ï´Ù. °»½Å ·ê¿¡ ´ëÇØ¼­ ·ê ½Ã½ºÅÛÀº Äõ¸® Æ®¸®ÀÇ ¸®½ºÆ®¸¦ »ý¼ºÇÕ´Ï´Ù. óÀ½¿¡ Äõ¸® Æ®¸® ¸®½ºÆ®´Â ºñ¾îÀÖ½À´Ï´Ù. 0(NOTHINGŰ¿öµå), 1°³ ¶Ç´Â º¹¼öÀÇ µ¿ÀÛÀÌ À¯È¿ÇÕ´Ï´Ù. °£´ÜÇÏ°Ô Çϱâ À§ÇØ, ¿©±â¿¡¼­´Â 1°³ÀÇ µ¿ÀÛÀÇ ·êÀ» ´Ù·ì´Ï´Ù. ÀÌ ·êÀº Á¶°ÇÀ» °¡Áö°í ÀÖµç ¾øµç »ó°üÇÏÁö¾Ê°í, ¶Ç INSTEAD³ª ALSO(±âº»°ª)ÀÇ ¾î´ÀÂÊÀ̵ç ÃëÇÒ ¼ö ÀÖ½À´Ï´Ù.

·ê Á¶°ÇÀ̶õ ¾î¶² °ÍÀԴϱî. ±×°ÍÀº ·êÀÇ µ¿ÀÛÀ» ½Ç½ÃÇÏÁö ¾ÊÀ¸¸é ¾È µÉ ¶§¿Í ÇØ¾ßÇÒ ¶§¸¦ ÁöÁ¤ÇÏ´Â Á¶°ÇÀÔ´Ï´Ù. ÀÌ Á¶°ÇÀº, ±âº»ÀûÀ¸·Î(Ưº°ÇÑ ÀÌÀ¯¸¦ °¡Áø) °´Ã¼·Î¼­ ÁÖ¾îÁö´Â ¸±·¹À̼ÇÀÎ NEWÀ¯»ç ¸±·¹À̼ÇÀ̳ª OLDÀ¯»ç ¸±·¹À̼Ç, ¶Ç´Â, ±× ¾çÀÚ¸¸À» ÂüÁ¶ÇÒ ¼ö ÀÖ½À´Ï´Ù.

ÇÑ µ¿ÀÛÀÇ ·ê¿¡ ´ëÇØ, ÀÌÇÏÀÇ Äõ¸® Æ®¸®¸¦ »ý¼ºÇÏ´Â 3°³ÀÇ °æ¿ì°¡ ÀÖ½À´Ï´Ù.

ALSO ¶Ç´Â INSTEAD·Î Á¶°ÇÀÌ ¾ø´Â °æ¿ì.

the query tree from the rule action with the original query tree's qualification added

Qualification given and ALSO

º»·¡ÀÇ ¹®ÀÇ Æ®¸®ÀÇ Á¶°ÇÀÌ Ãß°¡µÈ, ·ê µ¿ÀÛÀ¸·ÎºÎÅÍÀÇ Äõ¸® Æ®¸®

Á¶°ÇºÎ, ÇÑÆíALSO

·ê Á¶°Ç°ú º»·¡ÀÇ Äõ¸® Æ®¸®ÀÇ Á¶°ÇÀÌ Ãß°¡µÈ, ·ê ¾×¼ÇÀ¸·ÎºÎÅÍÀÇ Äõ¸® Æ®¸®

¸¶Áö¸·À¸·Î, ·êÀÌ ALSOÀÇ °æ¿ì, º¯°æµÇ¾î ÀÖÁö ¾ÊÀº º»·¡ÀÇ Äõ¸® Æ®¸®¸¦ ¸®½ºÆ®¿¡ µ¡ºÙÀÏ ¼ö ÀÖ½À´Ï´Ù. Á¶°ÇºÎÀÇ INSTEAD·ê¸¸ÀÌ ÀÌ¹Ì º»·¡ÀÇ Äõ¸® Æ®¸®¿¡ Ãß°¡¸¦ Çϰí ÀÖÀ¸¹Ç·Î, 1°³ÀÇ µ¿ÀÛÀ» °¡Áö´Â ·ê¿¡ ´ëÇØ¼­ 1°³ ȤÀº 2°³ÀÇ Äõ¸® Æ®¸®¿¡ °¡±î½º·Î µµÂøÇÕ´Ï´Ù.

ON INSERT·ê¿¡¼­´Â, º»·¡ÀÇ Äõ¸®´Â, (INSTEAD¿¡ ÀÇÇØ Á¦Áö´çÇÏÁö ¾ÊÀº ÇÑ) ·ê¿¡ ÀÇÇØ Ãß°¡µÈ µ¿ÀÛÀÇ Àü¿¡ ½ÇÇàµË´Ï´Ù. À̰Ϳ¡ ÀÇÇØ, µ¿ÀÛÀº »ðÀÔµÈ Çà(º¹¼ö°¡´É)À» ÂüÁ¶ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ±×·¯³ª, ON UPDATE¿Í ON DELETE·ê¿¡¼­´Â, º»·¡ÀÇ Äõ¸®´Â ·ê¿¡ ÀÇÇØ Ãß°¡µÈ µ¿ÀÛÀÇ µÚ¿¡ ½ÇÇàµË´Ï´Ù. À̰ÍÀº, µ¿ÀÛÀÌ °»½ÅµÉ ¿¹Á¤ÀÇ, ¶Ç´Â »èÁ¦µÉ ¿¹Á¤ÀÇ ÇàÀ» ÂüÁ¶ÇÒ ¼ö ÀÖ´Â °ÍÀ» º¸ÁõÇÕ´Ï´Ù. ±×·¸Áö ¾ÊÀ¸¸é, Á¶°Ç¿¡ ÀÏÄ¡ÇÏ´Â ÇàÀ» ã¾Æ³¾ ¼ö°¡ ¾ø±â ¶§¹®¿¡, µ¿ÀÛÀÌ ÀÛµ¿ÇÏÁö ¾Ê°Ô µÉ °¡´É¼ºÀÌ ÀϾ´Ï´Ù.

·ê µ¿ÀÛÀ¸·Î »ý¼ºµÈ Äõ¸® Æ®¸®´Â, ÀçÂ÷ ÀçÀÛ¼º ½Ã½ºÅÛ¿¡ °Ç³×Á® »ó´ç¼öÀÇ Äõ¸® Æ®¸®ÀÇ °á°ú¸¦ °¡Á®¿À´Â, º¸´Ù ¸¹Àº ·êÀÇ Àû¿ëÀ» ¹Þ´Â Àϵµ ÀÖ½À´Ï´Ù. ±×·¯´Ï±î, ·êÀÇ µ¿ÀÛÀº ·ê ÀڽŰú´Â ´Ù¸¥ ¸í·É Á¾·ù³ª, ´Ù¸¥ °á°ú ¸±·¹À̼ÇÀ» °¡Áö°í ÀÖÁö ¾ÊÀ¸¸é ¾ÈµË´Ï´Ù. ±×·¸Áö ¾ÊÀ¸¸é, ÀÌ ¹Ýº¹Àû 󸮿¡ ÀÇÇØ ¹«ÇÑ ·çÇÁ¿¡ ºüÁ® ¹ö¸³´Ï´Ù. (·êÀÇ ¹Ýº¹ Àü°³´Â °¨ÁöµÇ¾î ¿¡·¯·Î¼­ º¸°íµË´Ï´Ù. )

pg_rewrite½Ã½ºÅÛ ¸ñ·ÏÀÇ µ¿ÀÛ¿¡ ÀÖ´Â Äõ¸® Æ®¸®´Â ´Ü¼øÇÑ ÅÛÇø´ÀÔ´Ï´Ù. À̰͵éÀº NEW¿Í OLD¿¡ ´ëÇÑ ¹üÀ§ Å×À̺íÀÇ Ç׸ñÀ» ÂüÁ¶ÇÒ ¼ö°¡ Àֱ⠶§¹®¿¡, »ç¿ëµÇ±â Àü¿¡ ¾î¶°ÇÑ Ä¡È¯ Á¶Ä¡°¡ ÃëÇØÁ®¾ß ÇÕ´Ï´Ù. NEW¸¦ ÂüÁ¶ÇÏ´Â ¸ðµÎ¿¡ ´ëÇØ, º»·¡ÀÇ Äõ¸®ÀÇ ´ë»ó ¸®½ºÆ®´Â ´ëÀÀÇÏ´Â Ç׸ñÀÌ ÀÖ´ÂÁö ¾ø´ÂÁö °Ë»öµË´Ï´Ù. Ç׸ñÀÌ ¹ß°ßµÇ¾úÀ» °æ¿ì¿¡´Â, ±× Ç׸ñ½ÄÀÌ ÂüÁ¶¸¦ ¿Å°Ü³õ½À´Ï´Ù. Ç׸ñÀÌ ¾ø¾ú´ø °æ¿ì, NEW´Â OLD¿Í °°Àº Àǹ̰¡ µÇ°Å³ª(UPDATEÀÇ °æ¿ì), NULL¿¡ ÀÇÇØ ¿Å°Ü³õÀ» ¼ö ÀÖ½À´Ï´Ù(INSERTÀÇ °æ¿ì). OLD¿¡ ´ëÇÑ ÂüÁ¶´Â ¸ðµÎ °á°ú ¸±·¹À̼ÇÀÎ ¹üÀ§ Å×À̺íÀÇ Ç׸ñ¿¡ÀÇ ÂüÁ¶·Î ¿Å°ÜÁý´Ï´Ù.

°»½Å ·êÀÇ Àû¿ëÀÌ ³¡³ª¸é, ½Ã½ºÅÛÀº °Å±â¼­ ¸¸µé¾îÁø Äõ¸® Æ®¸®¿¡ ºä ·êÀ» Àû¿ëÇÕ´Ï´Ù. ºä´Â, »õ·Î¿î °»½Å µ¿ÀÛÀ» »ðÀÔÇÒ ¼ö ¾ø±â ¶§¹®¿¡, ºä ÀçÀÛ¼ºÀÇ °á°ú¿¡ °»½Å ·êÀ» Àû¿ëÇÒ ÇÊ¿ä´Â ¾ø½À´Ï´Ù.

35.3.1.1. ´Ü°è º° ù¹øÂ° ·ê

shoelace_data¸±·¹À̼ÇÀÇ sl_avail¿­ÀÇ º¯È­¸¦ ÃßÀûÇØ º¸°í ½Í´Ù°í ÇսôÙ. ·Î±×¿ë Å×À̺í°ú shoelace_data¿¡ ´ëÇØ¼­ ÇàÇØÁö´Â UPDATE¸¦ ·Î±×¿¡ ±â·ÏÇÏ´Â ·êÀ» ÁغñÇß½À´Ï´Ù.

CREATE TABLE shoelace_log (
    sl_name    text,          -- º¯°æµÈ ½Å¹ß²ö
    sl_avail   integer,       -- »õ·Î¿î ÇöÀç °¡°Ý
    log_who    text,          -- ´©°¡ Çß´ÂÁö
    log_when   timestamp      -- ¾ðÁ¦ Çß´ÂÁö
);

CREATE RULE log_shoelace AS ON UPDATE TO shoelace_data
    WHERE NEW.sl_avail <> OLD.sl_avail
    DO INSERT INTO shoelace_log VALUES (
                                    NEW.sl_name,
                                    NEW.sl_avail,
                                    current_user,
                                    current_timestamp
                                );

¿©±â¼­ ´©±º°¡°¡ ÀÌÇϸ¦ ½ÇÇàÇÕ´Ï´Ù.

UPDATE shoelace_data SET sl_avail = 6 WHERE sl_name = 'sl7';

·Î±× Å×À̺íÀ» º¾½Ã´Ù.

SELECT * FROM shoelace_log;

 sl_name | sl_avail | log_who | log_when                        
---------+----------+---------+----------------------------------
 sl7     |        6 | Al      | Tue Oct 20 16:14:45 1998 MET DST
(1 row)

»ý°¢ÇÑ ´ë·ÎÀÇ °á°ú°¡ ³ª¿Ô½À´Ï´Ù. ÀÌÇÏ¿¡ µÚ¿¡¼­ ¹«¾ùÀÌ ÀϾ´ÂÁö¸¦ ¼³¸íÇÕ´Ï´Ù. ÆÄ¼­°¡ ¿ì¼± ÀÌÇÏÀÇ Äõ¸® Æ®¸®¸¦ »ý¼ºÇß½À´Ï´Ù.

UPDATE shoelace_data SET sl_avail = 6
  FROM shoelace_data shoelace_data
 WHERE shoelace_data.sl_name = 'sl7';

ÀÌÇÏÀÇ ·ê Á¶°Ç½Ä

NEW.sl_avail <> OLD.sl_avail

¹×, ÀÌÇÏÀÇ µ¿ÀÛÀ» °¡Áö´Â ON UPDATEÀÇ log_shoelace·êÀÌ ÀÖ½À´Ï´Ù.

INSERT INTO shoelace_log VALUES (
       *NEW*.sl_name, *NEW*.sl_avail,
       current_user, current_timestamp )
  FROM shoelace_data *NEW*, shoelace_data *OLD*;

(Åë»ó, INSERT ... VALUES ... FROM¸¦ ¾µ ¼ö ¾ø±â ¶§¹®¿¡ Á¶±Ý ÀÌ»óÇÏ°Ô º¸ÀÏÁöµµ ¸ð¸¨´Ï´Ù. ¿©±âÀÇ FROM±¸´Â ´ÜÁö *NEW*¿Í *OLD*ÀÇ Äõ¸® Æ®¸®ÀÇ ¹üÀ§ Å×À̺í Ç׸ñÀÌ ÀÖ´Â °ÍÀ» ³ªÅ¸³»°í ÀÖÀ» »ÓÀÔ´Ï´Ù. À̰͵éÀº, INSERT¸í·ÉÀÇ Äõ¸® Æ®¸®ÁßÀÇ º¯¼ö·ÎºÎÅÍ ÂüÁ¶µÇ±â À§Çؼ­ ÇÊ¿äÇÕ´Ï´Ù. )

ÀÌ ·êÀº Á¶°ÇºÎÀÇ ALSO·êÀ̹ǷÎ, ·ê ½Ã½ºÅÛÀº º¯°æµÈ ·ê µ¿ÀÛ°ú º»·¡ÀÇ Äõ¸® Æ®¸®¶ó´Â 2°³ÀÇ Äõ¸® Æ®¸®¸¦ µ¹·ÁÁÖÁö ¾ÊÀ¸¸é ¾ÈµË´Ï´Ù. Á¦1ÀÇ ´Ü°è¿¡¼­ º»·¡ÀÇ Äõ¸®ÀÇ ¹üÀ§ Å×À̺íÀº ·ê µ¿ÀÛ Äõ¸® Æ®¸®¿¡ ¹Þ¾Æµé¿©Áý´Ï´Ù. ±×¸®°í, ´ÙÀ½ÀÇ °á°ú¸¦ ³º½À´Ï´Ù.

INSERT INTO shoelace_log VALUES (
       *NEW*.sl_name, *NEW*.sl_avail,
       current_user, current_timestamp )
  FROM shoelace_data *NEW*, shoelace_data *OLD*,
       shoelace_data shoelace_data;

Á¦2 ´Ü°è¿¡¼­, ÀÌÇÏ¿Í °°ÀÌ ·ê Á¶°ÇÀ» µ¡ºÙÀÏ ¼ö ÀÖ½À´Ï´Ù. À̰Ϳ¡ ÀÇÇØ, ÀÌ °á°ú ÁýÇÕÀº sl_avail°¡ º¯°æÇÑ ÇàÀ¸·Î ÇÑÁ¤µË´Ï´Ù.

INSERT INTO shoelace_log VALUES (
       *NEW*.sl_name, *NEW*.sl_avail,
       current_user, current_timestamp )
  FROM shoelace_data *NEW*, shoelace_data *OLD*,
       shoelace_data shoelace_data
 WHERE *NEW*.sl_avail <> *OLD*.sl_avail;

(INSERT ... VALUES´Â WHERE±¸¸¦ °¡ÁöÁö ¾Ê±â ¶§¹®¿¡, À̰ÍÀº ´õ ÀÌ»óÇÕ´Ï´Ù. ±×·¯³ª, Ç÷¡³Ê¿Í ÁýÇàÀÚ¿¡´Â ¹®Á¦´Â ¾ø½À´Ï´Ù. À̰͵éÀº ¾î·µç INSERT ... SELECT¸¦ À§Çؼ­ °°Àº ±â´ÉÀ» Áö¿øÇÏÁö ¾ÊÀ¸¸é ¾ÈµË´Ï´Ù.)

Á¦3 ´Ü°è¿¡¼­, ÀÌÇÏ¿Í °°ÀÌ º»·¡ÀÇ Äõ¸® Æ®¸®ÀÇ Á¶°ÇÀ» µ¡ºÙÀÏ ¼ö ÀÖ¾î, °á°ú ÁýÇÕÀº º»·¡ÀÇ Äõ¸®·Î º¯°æµÈ Çà¿¡¸¸À¸·Î ÇÑÃþ ´õ ÇÑÁ¤µË´Ï´Ù.

INSERT INTO shoelace_log VALUES (
       *NEW*.sl_name, *NEW*.sl_avail,
       current_user, current_timestamp )
  FROM shoelace_data *NEW*, shoelace_data *OLD*,
       shoelace_data shoelace_data
 WHERE *NEW*.sl_avail <> *OLD*.sl_avail
   AND shoelace_data.sl_name = 'sl7';

Á¦4 ´Ü°è¿¡¼­´Â, ÀÌÇÏ¿Í °°ÀÌ º»·¡ÀÇ Äõ¸® Æ®¸®ÀÇ ´ë»ó ¸®½ºÆ® Ç׸ñ, ¶Ç´Â °á°ú ¸±·¹À̼ÇÀÇ ÇØ´çÇÏ´Â º¯¼ö ÂüÁ¶·Î, NEWÀÇ ÂüÁ¶¸¦ ġȯÇÕ´Ï´Ù.

INSERT INTO shoelace_log VALUES (
       shoelace_data.sl_name, 6,
       current_user, current_timestamp )
  FROM shoelace_data *NEW*, shoelace_data *OLD*,
       shoelace_data shoelace_data
 WHERE 6 <> *OLD*.sl_avail
   AND shoelace_data.sl_name = 'sl7';

Á¦5 ´Ü°è´Â, ÀÌÇÏ¿Í °°ÀÌ OLDÂüÁ¶¸¦ °á°ú ¸±·¹ÀÌ¼Ç ÂüÁ¶¿¡ ¿Å°Ü³õ½À´Ï´Ù.

INSERT INTO shoelace_log VALUES (
       shoelace_data.sl_name, 6,
       current_user, current_timestamp )
  FROM shoelace_data *NEW*, shoelace_data *OLD*,
       shoelace_data shoelace_data
 WHERE 6 <> shoelace_data.sl_avail
   AND shoelace_data.sl_name = 'sl7';

À̰ÍÀÌ ¸¶Áö¸·ÀÔ´Ï´Ù. ÀÌ ·êÀº ALSOÀ̱⠶§¹®¿¡, º»·¡ÀÇ Äõ¸® Æ®¸®µµ Ãâ·ÂÇÕ´Ï´Ù. Á¤¸®Çϸé, ·ê ½Ã½ºÅÛÀ¸·ÎºÎÅÍÀÇ Ãâ·ÂÀº ÀÌÇÏÀÇ ¹®Àå¿¡ ´ëÀÀÇÏ´Â 2°³ÀÇ Äõ¸® Æ®¸®ÀÇ ¸®½ºÆ®ÀÔ´Ï´Ù.

INSERT INTO shoelace_log VALUES (
       shoelace_data.sl_name, 6,
       current_user, current_timestamp )
  FROM shoelace_data
 WHERE 6 <> shoelace_data.sl_avail
   AND shoelace_data.sl_name = 'sl7';

UPDATE shoelace_data SET sl_avail = 6
 WHERE sl_name = 'sl7';

ÀÌ µÎ°¡Áö´Â Â÷·Ê´ë·Î 󸮵Ǿî Á¤È®ÇÏ°Ô ·êÀÌ Á¤ÀÇÇÑ ´ë·ÎÀÔ´Ï´Ù.

¿¹¸¦ µé¾î º»·¡ÀÇ Äõ¸®°¡ ¾Æ·¡¿Í °°Àº °æ¿ì¿¡, ġȯ°ú Ãß°¡µÈ Á¶°ÇÀº, ·Î±×¿¡´Â ¾Æ¹«°Íµµ ¾²¿©ÁöÁö ¾Ê´Â °ÍÀ» È®½ÇÈ÷ ÇÕ´Ï´Ù.

UPDATE shoelace_data SET sl_color = 'green'
 WHERE sl_name = 'sl7';

ÀÌ °æ¿ì, º»·¡ÀÇ Äõ¸® Æ®¸®ÀÇ ´ë»ó ¸®½ºÆ®¿¡´Â sl_availÀÇ Ç׸ñÀÌ ¾ø±â ¶§¹®¿¡, NEW.sl_avail°¡ shoelace_data.sl_avail·Î ¿Å°ÜÁý´Ï´Ù. ±× °á°ú, ÀÌ ·ê¿¡ ÀÇÇØ ÀÌÇÏ¿Í °°Àº Ưº°ÇÑ Äõ¸®°¡ »ý¼ºµË´Ï´Ù.

INSERT INTO shoelace_log VALUES (
       shoelace_data.sl_name, shoelace_data.sl_avail,
       current_user, current_timestamp )
  FROM shoelace_data
 WHERE shoelace_data.sl_avail <> shoelace_data.sl_avail
   AND shoelace_data.sl_name = 'sl7';

±×¸®°í ÀÌ Á¶°ÇÀº °áÄÚ ½ÇÇöµÇÁö ¾Ê½À´Ï´Ù.

¸¸¾à º»·¡ÀÇ Äõ¸®°¡ º¹¼öÀÇ ÇàÀ» º¯°æÇصµ Àߵ˴ϴÙ. µû¶ó¼­, ´©±º°¡°¡ ¾Æ·¡¿Í °°Àº ¸í·ÉÀ» ½ÇÇàÇß´Ù°í ÇÕ´Ï´Ù.

UPDATE shoelace_data SET sl_avail = 0
 WHERE sl_color = 'black';

ÀÌ °æ¿ì, ½ÇÁ¦·Î´Â 4ÇàÀÌ °»½ÅµË´Ï´Ù(sl1, sl2, sl3 ¹× sl4). ±×·¯³ª s13´Â ÀÌ¹Ì sl_avail = 0À» °¡Áö°í ÀÖ½À´Ï´Ù. ÀÌ °æ¿ì, º»·¡ÀÇ Äõ¸® Æ®¸®ÀÇ Á¶°ÇÀ» ä¿ìÁö ¾Ê°í, ±× °á°ú, ÀÌÇÏ¿Í °°Àº Ưº°ÇÑ Äõ¸® Æ®¸®°¡ ·ê¿¡ ÀÇÇØ »ý¼ºµË´Ï´Ù.

INSERT INTO shoelace_log
SELECT shoelace_data.sl_name, 0,
       current_user, current_timestamp
  FROM shoelace_data
 WHERE 0 <> shoelace_data.sl_avail
   AND shoelace_data.sl_color = 'black';

ÀÌ ±¸¹® ºÐ¼® Æ®¸®´Â È®½ÇÈ÷ 3°³ÀÇ »õ·Î¿î ·Î±× Ç׸ñÀ» »ðÀÔÇÕ´Ï´Ù. À̰ÍÀº ¿ÏÀüÈ÷ ¿Ã¹Ù¸¥ µ¿ÀÛÀÔ´Ï´Ù

¿©±â¼­ º»·¡ÀÇ Äõ¸® Æ®¸®°¡ ¸¶Áö¸·¿¡ ½ÇÇàµÇ´Â °ÍÀÌ Áß¿äÇÑ ÀÌÀ¯¸¦ ¾Ë ¼ö ÀÖ½À´Ï´Ù. ¸¸¾à UPDATE°¡ ¸ÕÀú ½ÇÇàµÇ¾ú´Ù°í Çϸé, ¸ðµç ÇàÀº 0¿¡ ¼¼Æ® µÇ¾î 0 <> shoelace_data.sl_availÀÎ ÇàÀ» ·Î±× ±âÀÔ½ÃÀÇ INSERTÀÇ ´Ü°è¿¡¼­ ã¾Æ³¾ ¼ö ¾ø°Ô µË´Ï´Ù.

35.3.2. ºä¿ÍÀÇ ÇùÁ¶

´©±º°¡°¡ ºä¿¡ ´ëÇØ INSERT, UPDATE, DELETE¸¦ ¹ßÇàÇÒ ¼ö ÀÖ´Ù°í, °Å·ÐµÈ °¡´É¼ºÀ¸·ÎºÎÅÍ ºä ¸±·¹À̼ÇÀ» º¸È£ÇÏ´Â °£´ÜÇÑ ¹æ¹ýÀº, ±×·¯ÇÑ Äõ¸® Æ®¸®¸¦ ÆÄ±âÇØ ¹ö¸®´Â °ÍÀÔ´Ï´Ù. ÀÌ ¶§¹®¿¡ ÀÌÇÏÀÇ ·êÀ» ¸¸µé ¼ö°¡ ÀÖ½À´Ï´Ù.

CREATE RULE shoe_ins_protect AS ON INSERT TO shoe
    DO INSTEAD NOTHING;
CREATE RULE shoe_upd_protect AS ON UPDATE TO shoe
    DO INSTEAD NOTHING;
CREATE RULE shoe_del_protect AS ON DELETE TO shoe
    DO INSTEAD NOTHING;

´©±º°¡°¡ shoeºä ¸±·¹À̼ǿ¡ »ó±âÀÇ Á¶ÀÛÀ» ½Ç½ÃÇÏ·Á°í Çϸé, ·ê ½Ã½ºÅÛÀº ·êÀ» Àû¿ëÇÕ´Ï´Ù. ·ê¿¡´Â µ¿ÀÛÀÌ ¾ø°í, ÇÑÆí, INSTEADÀ̱⠶§¹®¿¡, °á°úÀÇ Äõ¸® Æ®¸® ¸®½ºÆ®´Â ºñ¿ó´Ï´Ù. ·ê ½Ã½ºÅÛÀÇ Ã³¸®°¡ ¿Ï·áÇÑ ÈÄ¿¡, ÃÖÀûÈ­µÇ°Å³ª ½ÇÇàµÇ¾î¾ß ÇÒ °ÍÀÌ ¾Æ¹«°Íµµ ³²¾Æ ÀÖÁö ¾ÊÀ¸¹Ç·Î, Äõ¸® Àüü°¡ ¹«È¿°¡ µË´Ï´Ù.

º¸´Ù ÀûÀýÇÑ ·ê ½Ã½ºÅÛÀÇ »ç¿ë¹ýÀº, ½ÇÁ¦ Å×ÀÌºí¿¡ Àû´çÇÑ Á¶ÀÛÀ» ½Ç½ÃÇÏ´Â Äõ¸® Æ®¸®¿¡ÀÇ ÀçÀÛ¼ºÀ» ½Ç½ÃÇÏ´Â ·êÀ» ¸¸µå´Â °ÍÀÔ´Ï´Ù. shoelaceºä¿¡ À̰ÍÀ» Àû¿ëÇϱâ À§Çؼ­ ÀÌÇÏÀÇ ·êÀ» ¸¸µì´Ï´Ù.

CREATE RULE shoelace_ins AS ON INSERT TO shoelace
    DO INSTEAD
    INSERT INTO shoelace_data VALUES (
           NEW.sl_name,
           NEW.sl_avail,
           NEW.sl_color,
           NEW.sl_len,
           NEW.sl_unit
    );

CREATE RULE shoelace_upd AS ON UPDATE TO shoelace
    DO INSTEAD
    UPDATE shoelace_data
       SET sl_name = NEW.sl_name,
           sl_avail = NEW.sl_avail,
           sl_color = NEW.sl_color,
           sl_len = NEW.sl_len,
           sl_unit = NEW.sl_unit
     WHERE sl_name = OLD.sl_name;

CREATE RULE shoelace_del AS ON DELETE TO shoelace
    DO INSTEAD
    DELETE FROM shoelace_data
     WHERE sl_name = OLD.sl_name;

ÀÌ ºä»ó¿¡¼­ RETURNINGÄõ¸®¸¦ Áö¿øÇÏ°í ½ÍÀº °æ¿ì, ºäÀÇ ÇàÀ» °è»êÇÏ´Â RETURNING±¸¸¦ Æ÷ÇÔÇÑ ·êÀ» ÀÛ¼ºÇÏÁö ¾ÊÀ¸¸é ¾ÈµË´Ï´Ù. À̰ÍÀº Åë»ó, ´ÜÀÏ Å×ÀÌºí¿¡ ´ëÇÑ ºä¿¡¼­´Â ¸Å¿ì °£´ÜÇÕ´Ï´Ù¸¸, shoelace¿Í °°Àº ºä¸¦ °áÇÕÇÏ´Â °æ¿ì´Â ´Ù¼Ò ±ÍÂú½À´Ï´Ù. »ðÀÔÇÏ´Â °æ¿ì¸¦ ¿¹·Î¼­ ÀÌÇÏ¿¡ ³ªÅ¸³À´Ï´Ù.

CREATE RULE shoelace_ins AS ON INSERT TO shoelace
    DO INSTEAD
    INSERT INTO shoelace_data VALUES (
           NEW.sl_name,
           NEW.sl_avail,
           NEW.sl_color,
           NEW.sl_len,
           NEW.sl_unit
    )
    RETURNING
           shoelace_data.*,
           (SELECT shoelace_data.sl_len * u.un_fact
            FROM unit u WHERE shoelace_data.sl_unit = u.un_name);

ÀÌ 1°³ÀÇ ·êÀÌ, ºä¿¡ ´ëÇÑ INSERTÄõ¸®¿Í INSERT RETURNINGÄõ¸® ·êÀ» Áö¿øÇÏ´Â °Í¿¡ ÁÖÀÇÇØ ÁÖ¼¼¿ä. INSERT¿¡¼­´Â RETURNING±¸°¡ ¹«½ÃµÉ »ÓÀÔ´Ï´Ù.

¿©±â¼­ °¡°Ô¿¡´Â ºÎÁ¤±âÀûÀ¸·Î ½Å¹ß²öÀÇ ÄÉÀ̽º°¡ µÎ²¨¿î ¿î¼ÛÀå°ú ÇÔ²² µµÂøµÈ´Ù°í °¡Á¤ÇÕ´Ï´Ù. ±×·¯³ª, ¸Åȸ ¸Åȸ ¼öÀÛ¾÷À¸·Î shoelaceºä¸¦ °»½ÅÇÏ°í ½ÍÁö´Â ¾Ê½À´Ï´Ù. ´ë½Å¿¡, ¿î¼ÛÀåÀ¸·ÎºÎÅÍ Ç°¸ñÀ» »ðÀÔÇÏ´Â Å×À̺í°ú Ư¼öÇÑ ÀåÄ¡¸¦ °¡Áö´Â Å×À̺íÀÇ 2°³ÀÇ ÀÛÀº Å×À̺íÀ» ÁغñÇÕ´Ï´Ù. ÀÌÇÏ´Â ±×°ÍµéÀ» ÀÛ¼ºÇÏ´Â ¸í·ÉÀÔ´Ï´Ù.

CREATE TABLE shoelace_arrive (
    arr_name    text,
    arr_quant   integer
);

CREATE TABLE shoelace_ok (
    ok_name     text,
    ok_quant    integer
);

CREATE RULE shoelace_ok_ins AS ON INSERT TO shoelace_ok
    DO INSTEAD
    UPDATE shoelace
       SET sl_avail = sl_avail + NEW.ok_quant
     WHERE sl_name = NEW.ok_name;

À̰ÍÀ¸·Î, ¿î¼ÛÀåÀÇ µ¥ÀÌÅ͸¦ shoelace_arriveÅ×ÀÌºí¿¡ ÅõÀÔÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.

SELECT * FROM shoelace_arrive;

 arr_name | arr_quant
----------+-----------
 sl3      |        10
 sl6      |        20
 sl8      |        20
(3 rows)

±×¸®°í ÇöÀçÀÇ µ¥ÀÌÅ͸¦ üũÇÕ´Ï´Ù.

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      |        6 | 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)

ÀÌÁ¦, µµÃ¢µÈ ½Å¹ß²öÀ» À̵¿ÇÕ´Ï´Ù.

INSERT INTO shoelace_ok SELECT * FROM shoelace_arrive;

±×¸®°í °á°ú¸¦ È®ÀÎÇÕ´Ï´Ù.

SELECT * FROM shoelace ORDER BY sl_name;

 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      |        6 | brown    |     60 | cm      |        60
 sl4      |        8 | black    |     40 | inch    |     101.6
 sl3      |       10 | black    |     35 | inch    |      88.9
 sl8      |       21 | brown    |     40 | inch    |     101.6
 sl5      |        4 | brown    |      1 | m       |       100
 sl6      |       20 | brown    |    0.9 | m       |        90
(8 rows)

SELECT * FROM shoelace_log;

 sl_name | sl_avail | log_who| log_when                        
---------+----------+--------+----------------------------------
 sl7     |        6 | Al     | Tue Oct 20 19:14:45 1998 MET DST
 sl3     |       10 | Al     | Tue Oct 20 19:25:16 1998 MET DST
 sl6     |       20 | Al     | Tue Oct 20 19:25:16 1998 MET DST
 sl8     |       21 | Al     | Tue Oct 20 19:25:16 1998 MET DST
(4 rows)

1°³ÀÇ INSERT ... SELECT·ÎºÎÅÍ ÀÌ °á°ú°¡ µÇ·Á¸é, ±ä °úÁ¤ÀÌ ÀÖ½À´Ï´Ù. º»Àå¿¡¼­ÀÇ Äõ¸® Æ®¸®ÀÇ º¯Çü¿¡ °üÇÑ ¼³¸íÀº À̰ÍÀÌ ¸¶Áö¸·ÀÔ´Ï´Ù. ¿ì¼±, ÀÌÇÏ¿Í °°Àº ÆÄ¼­ÀÇ Ãâ·ÂÀÌ ÀÖ½À´Ï´Ù.

INSERT INTO shoelace_ok
SELECT shoelace_arrive.arr_name, shoelace_arrive.arr_quant
  FROM shoelace_arrive shoelace_arrive, shoelace_ok shoelace_ok;

ÃÖÃÊÀÇ shoelace_ok_ins·êÀÌ Àû¿ëµÇ¾î °á°ú´Â ÀÌÇÏ¿Í °°ÀÌ µË´Ï´Ù.

UPDATE shoelace
   SET sl_avail = shoelace.sl_avail + shoelace_arrive.arr_quant
  FROM shoelace_arrive shoelace_arrive, shoelace_ok shoelace_ok,
       shoelace_ok *OLD*, shoelace_ok *NEW*,
       shoelace shoelace
 WHERE shoelace.sl_name = shoelace_arrive.arr_name;

±×¸®°í, shoelace_ok¿¡ ´ëÇÑ º»·¡ÀÇ INSERT¸¦ ÆÄ±âÇÕ´Ï´Ù. ÀçÀÛ¼ºµÈ Äõ¸®´Â ´Ù½Ã ·ê ½Ã½ºÅÛ¿¡°Ô °Ç³×Á®, 2¹øÂ°¿¡ Àû¿ëµÇ´Â shoelace_upd·êÀº ÀÌÇϸ¦ »ý¼ºÇÕ´Ï´Ù.

UPDATE shoelace_data
   SET sl_name = shoelace.sl_name,
       sl_avail = shoelace.sl_avail + shoelace_arrive.arr_quant,
       sl_color = shoelace.sl_color,
       sl_len = shoelace.sl_len,
       sl_unit = shoelace.sl_unit
  FROM shoelace_arrive shoelace_arrive, shoelace_ok shoelace_ok,
       shoelace_ok *OLD*, shoelace_ok *NEW*,
       shoelace shoelace, shoelace *OLD*,
       shoelace *NEW*, shoelace_data shoelace_data
 WHERE shoelace.sl_name = shoelace_arrive.arr_name
   AND shoelace_data.sl_name = shoelace.sl_name;

À̰ÍÀº ´Ù½Ã INSTEAD·êÀ̹ǷÎ, ÀÌÀüÀÇ Äõ¸® Æ®¸®´Â ÆÄ±âµË´Ï´Ù. ÀÌ Äõ¸®´Â shoelaceºä¸¦ °è¼ÓÇØ »ç¿ëÇϰí ÀÖ´Â °Í¿¡ ÁÖÀÇÇØ ÁÖ¼¼¿ä. ±×·¯³ª, ÀÌ ´Ü°è¿¡¼­´Â ·ê ½Ã½ºÅÛÀº Á¾·áÇϰí ÀÖÁö ¾Ê±â ¶§¹®¿¡, °è¼Ó _RETURN·êÀÌ Àû¿ëµÇ¾î ¾Æ·¡¿Í °°ÀÌ µË´Ï´Ù.

UPDATE shoelace_data
   SET sl_name = s.sl_name,
       sl_avail = s.sl_avail + shoelace_arrive.arr_quant,
       sl_color = s.sl_color,
       sl_len = s.sl_len,
       sl_unit = s.sl_unit
  FROM shoelace_arrive shoelace_arrive, shoelace_ok shoelace_ok,
       shoelace_ok *OLD*, shoelace_ok *NEW*,
       shoelace shoelace, shoelace *OLD*,
       shoelace *NEW*, shoelace_data shoelace_data,
       shoelace *OLD*, shoelace *NEW*,
       shoelace_data s, unit u
 WHERE s.sl_name = shoelace_arrive.arr_name
   AND shoelace_data.sl_name = s.sl_name;

¸¶Áö¸·À¸·Î, log_shoelace·êÀÌ Àû¿ëµÇ¾î ÀÌÇÏ¿Í °°ÀÌ Æ¯º°ÇÑ Äõ¸® Æ®¸®°¡ »ý¼ºµË´Ï´Ù.

INSERT INTO shoelace_log
SELECT s.sl_name,
       s.sl_avail + shoelace_arrive.arr_quant,
       current_user,
       current_timestamp
  FROM shoelace_arrive shoelace_arrive, shoelace_ok shoelace_ok,
       shoelace_ok *OLD*, shoelace_ok *NEW*,
       shoelace shoelace, shoelace *OLD*,
       shoelace *NEW*, shoelace_data shoelace_data,
       shoelace *OLD*, shoelace *NEW*,
       shoelace_data s, unit u,
       shoelace_data *OLD*, shoelace_data *NEW*
       shoelace_log shoelace_log
 WHERE s.sl_name = shoelace_arrive.arr_name
   AND shoelace_data.sl_name = s.sl_name
   AND (s.sl_avail + shoelace_arrive.arr_quant) <> s.sl_avail;

ÀÌ ÈÄ, ·ê ½Ã½ºÅÛÀº ·êÀ» ´Ù »ç¿ëÇØ, »ý¼ºµÈ Äõ¸® Æ®¸®¸¦ µ¹·ÁÁÝ´Ï´Ù.

±×¸®°í, ÀÌÇÏÀÇ SQL¹®°ú µî°¡°¡ µÇ´Â 2°³ÀÇ ÃÖÁ¾ Äõ¸® Æ®¸®·Î Á¾°áÇÕ´Ï´Ù.

INSERT INTO shoelace_log
SELECT s.sl_name,
       s.sl_avail + shoelace_arrive.arr_quant,
       current_user,
       current_timestamp
  FROM shoelace_arrive shoelace_arrive, shoelace_data shoelace_data,
       shoelace_data s
 WHERE s.sl_name = shoelace_arrive.arr_name
   AND shoelace_data.sl_name = s.sl_name
   AND s.sl_avail + shoelace_arrive.arr_quant <> s.sl_avail;
           
UPDATE shoelace_data
   SET sl_avail = shoelace_data.sl_avail + shoelace_arrive.arr_quant
  FROM shoelace_arrive shoelace_arrive,
       shoelace_data shoelace_data,
       shoelace_data s
 WHERE s.sl_name = shoelace_arrive.sl_name
   AND shoelace_data.sl_name = s.sl_name;

°á°ú´Â, 1°³ÀÇ ¸±·¹À̼ÇÀ¸·ÎºÎÅÍ ¿Â µ¥ÀÌÅͰ¡ ´Ù¸¥ ¸±·¹À̼ǿ¡ »ðÀԵǾî 3¹øÂ°ÀÇ ¸±·¹À̼ÇÀÇ °»½ÅÀ¸·Î º¯°æµÇ°í, 4¹øÂ°ÀÇ °»½Å°ú 5¹øÂ°¿¡ÀÇ ÃÖÁ¾ °»½ÅÀÇ ·Î±× ±â·ÏÀ¸·Î º¯°æµÇ¾î ÃÖÁ¾ÀûÀ¸·Î 2°³ÀÇ Äõ¸®¿¡ Ãà¼ÒµË´Ï´Ù.

Á¶±Ý º¸±â ÁÁÁö ¾ÊÀº ¼¼ºÎ »çÇ×ÀÌ ÀÖ½À´Ï´Ù. ¿Ï¼ºµÈ 2°³ÀÇ Äõ¸®¸¦ º¸¸é, 1°³·Î Ãà¼ÒµÇ¾úÀ½ÀÌ ºÐ¸íÇÑ shoelace_data¸±·¹À̼ÇÀÌ ¹üÀ§ Å×ÀÌºí¿¡ µÎ ¹ø ³ª¿É´Ï´Ù. Ç÷¡³Ê´Â 󸮸¦ ÇÏÁö ¾Ê±â ¶§¹®¿¡, INSERTÀÇ ·ê ½Ã½ºÅÛÀÇ Ãâ·Â¿¡ ´ëÇÑ ½ÇÇà °èȹÀº ´ÙÀ½°ú °°ÀÌ µË´Ï´Ù.

Æ÷°³Áø ·çÇÁ
  ->  º´ÇÕ °áÇÕ
        ->  ½ÃÄö¼È °Ë»ö
              ->  Á¤·Ä
                    ->  s¿¡ ´ëÇÑ ¼ø¼­ °Ë»ö
        ->  ½ÃÄö¼È °Ë»ö
              ->  Á¤·Ä
                    ->  shoelace_arrive¿¡ ´ëÇÑ ½ÃÄö¼È °Ë»ö
  ->  shoelace_data¿¡ ´ëÇÑ ½ÃÄö¼È °Ë»ö

ÇÑÆí, ºÒÇÊ¿äÇÑ ¹üÀ§ Å×À̺í Ç׸ñÀ» »ý·«ÇÏ´Â °ÍÀ¸·Î, ÀÌÇÏ¿Í °°ÀÌ ·Î±× Å×ÀÌºí¿¡ ¿ÏÀüÈ÷ °°Àº Ç׸ñÀÌ ¸¸µé¾îÁý´Ï´Ù.

º´ÇÕ °áÇÕ
  ->  ½ÃÄö¼È °Ë»ö
        ->  Á¤·Ä
              ->  s¿¡ ´ëÇÑ ½ÃÄö¼È °Ë»ö
  ->  ½ÃÄö¼È °Ë»ö
        ->  Á¤·Ä
              ->  shoelace_arrive¿¡ ´ëÇÑ ½ÃÄö¼È °Ë»ö

±×·¯´Ï±î, ·ê ½Ã½ºÅÛÀº, ÀüÇô Çʿ䰡 ¾ø´Â shoelace_data¸±·¹À̼ǿ¡ ´ëÇÑ ºÒÇÊ¿äÇÑ °Ë»öÀ» ÇÑ ¹ø ½Ç½ÃÇÏ°Ô µË´Ï´Ù. ±×¸®°í UPDATE¿¡¼­µµ µ¿ÀÏÇÑ ºÒÇÊ¿äÇÑ °Ë»öÀÌ ÀçÂ÷ ½ÇÇàµË´Ï´Ù. ±×·¸Áö¸¸, À̰͵éÀ» ¸ðµÎ °¡´ÉÇÏ°Ô ÇÏ´Â °ÍÀº ¾î·Á¿î ÀÏÀÔ´Ï´Ù.

¸¶Áö¸·¿¡ PostgreSQLÀÇ ·ê ½Ã½ºÅÛ°ú ±× È¿°ú¸¦ ³ªÅ¸³À½Ã´Ù. ¿¹¸¦ µé¸é, ÀüÇô ÆÈ¸± °Í °°Áö ¾ÊÀº ½Å¹ß²öÀ» µ¥ÀÌÅͺ£À̽º¿¡ Ãß°¡ÇØ º¸°Ú½À´Ï´Ù.

INSERT INTO shoelace VALUES ('sl9', 0, 'pink', 35.0, 'inch', 0.0);
INSERT INTO shoelace VALUES ('sl10', 1000, 'magenta', 40.0, 'inch', 0.0);

¸ðµç ±¸µÎ¿¡ ¸ÂÁö ¾Ê´Â »öÀÌ shoelaceÇ׸ñ¿¡ ÀÖÀ»Áö ¾øÀ»Áö¸¦ °Ë»çÇÏ´Â ºä¸¦ ÀÛ¼ºÇÏ°í ½Í´Ù°í ÇÕ´Ï´Ù. ºä´Â ÀÌÇÏ¿Í °°ÀÌ µË´Ï´Ù.

CREATE VIEW shoelace_mismatch AS
    SELECT * FROM shoelace WHERE NOT EXISTS
        (SELECT shoename FROM shoe WHERE slcolor = sl_color);

ÀÌ Ãâ·ÂÀº ÀÌÇÏ¿Í °°ÀÌ µË´Ï´Ù.

SELECT * FROM shoelace_mismatch;

 sl_name | sl_avail | sl_color | sl_len | sl_unit | sl_len_cm
---------+----------+----------+--------+---------+-----------
 sl9     |        0 | pink     |     35 | inch    |      88.9
 sl10    |     1000 | magenta  |     40 | inch    |     101.6

¿©±â¼­, ¸Â´Â ±¸µÎ°¡ ¾ø´Â ½Å¹ß²ö °¡¿îµ¥, Àç°í°¡ ¾ø´Â °ÍÀ» µ¥ÀÌÅͺ£À̽º·ÎºÎÅÍ »èÁ¦Çϵµ·Ï ¼³Á¤ÇØ º¸°Ú½À´Ï´Ù. À̰ÍÀº PostgreSQL¿¡¼­´Â °ï¶õÇÑ ÀÛ¾÷À̹ǷÎ, Á÷Á¢ »èÁ¦ÇÏÁö ¾Ê½À´Ï´Ù. ´ë½Å¿¡, ÀÌÇÏ¿Í °°ÀÌ 1°³ ºä¸¦ ÀÛ¼ºÇÕ´Ï´Ù.

CREATE VIEW shoelace_can_delete AS
    SELECT * FROM shoelace_mismatch WHERE sl_avail = 0;

±×¸®°í, ÀÌÇϸ¦ ½Ç½ÃÇÕ´Ï´Ù.

DELETE FROM shoelace WHERE EXISTS
    (SELECT * FROM shoelace_can_delete
             WHERE sl_name = shoelace.sl_name);

ÀÚ ÇÒ ¼ö ÀÖ¾ú½À´Ï´Ù.

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     |        6 | brown    |     60 | cm      |        60
 sl4     |        8 | black    |     40 | inch    |     101.6
 sl3     |       10 | black    |     35 | inch    |      88.9
 sl8     |       21 | brown    |     40 | inch    |     101.6
 sl10    |     1000 | magenta  |     40 | inch    |     101.6
 sl5     |        4 | brown    |      1 | m       |       100
 sl6     |       20 | brown    |    0.9 | m       |        90
(9 rows)

ÇÕ°è 4°³ÀÇ Æ÷°³Áø/°áÇÕµÈ ºä¸¦ ¼­ºêÄõ¸®ÀÇ Á¶°ÇÀ¸·Î¼­ °¡Á®, ±× ÁßÀÇ Çϳª´Â ºä¸¦ Æ÷ÇÔÇÑ ¼­ºêÄõ¸® Á¶°ÇÀ» °¡Á®, ÇÑÆí ¿¬»êµÈ ºäÀÇ ¿­ÀÌ »ç¿ëµÇ´Â °æ¿ìÀÇ, ºä¿¡ ´ëÇÑ DELETE°¡, ½ÇÁ¦ Å×ÀÌºí¿¡¼­ ¿ä±¸µÈ µ¥ÀÌÅ͸¦ »èÁ¦ÇÏ´Â, ´ÜÀÏÀÇ Äõ¸® Æ®¸®¿¡ °íÃÄ ¾µ ¼ö ÀÖ½À´Ï´Ù.

ÀÌ·¯ÇÑ ±¸Á¶°¡ ÇÊ¿äÇÑ »óȲÀº ½ÇÁ¦ »óȲ¿¡¼­´Â °ÅÀÇ ¾ø´Ù°í »ý°¢µË´Ï´Ù. ±×·¯³ª, ½ÇÁ¦·Î ÀÛµ¿ÇÏ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖÀ¸¸é ¾È½ÉÇÒ ¼ö ÀÖ½À´Ï´Ù.