| PostgreSQL 8.3.3¹®¼ | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 35. ·ê ½Ã½ºÅÛ | Fast Forward | Next |
INSERT, UPDATE, DELETE¿¡ Á¤ÀÇÇÏ´Â ·êÀº ÀüÀý¿¡¼ ÇØ¼³ÇÑ ºäÀÇ ·ê°ú´Â ¿ÏÀüÈ÷ ´Ù¸¨´Ï´Ù. ù°, ÀÌ·¯ÇÑ CREATE RULE¸í·É¿¡¼´Â ÀÌÇϸ¦ ½Ç½ÃÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.
µ¿ÀÛÀÌ ¾ø´Â ·êµµ °¡´ÉÇÕ´Ï´Ù.
º¹¼öÀÇ µ¿ÀÛÀ» °¡Áú ¼ö ÀÖ½À´Ï´Ù.
INSTEAD ȤÀº ALSO(±âº»°ª)À» ÃëÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.
À¯»ç ¸±·¹À̼ÇNEW¿Í OLD°¡ À¯¿ëÇØÁý´Ï´Ù.
·ê Á¶°ÇÀ» °®Ãâ ¼ö ÀÖ½À´Ï´Ù.
µÎ ¹øÂ°·Î, ±× °÷¿¡¼ Äõ¸® Æ®¸®¸¦ º¯°æÇÏÁö ¾Ê½À´Ï´Ù. ±× ´ë½Å¿¡ ½Å±ÔÀÇ 0°³ ÀÌ»óÀÇ Äõ¸® Æ®¸®¸¦ »ý¼ºÇØ, ¿ø·¡ÀÇ °ÍÀ» ÆÄ±âÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.
±¸¹®ÀÌ °è¼ÓµË´Ï´Ù.
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°³ÀÇ °æ¿ì°¡ ÀÖ½À´Ï´Ù.
the query tree from the rule action with the original query tree's qualification added
º»·¡ÀÇ ¹®ÀÇ Æ®¸®ÀÇ Á¶°ÇÀÌ Ãß°¡µÈ, ·ê µ¿ÀÛÀ¸·ÎºÎÅÍÀÇ Äõ¸® Æ®¸®
·ê Á¶°Ç°ú º»·¡ÀÇ Äõ¸® Æ®¸®ÀÇ Á¶°ÇÀÌ Ãß°¡µÈ, ·ê ¾×¼ÇÀ¸·ÎºÎÅÍÀÇ Äõ¸® Æ®¸®
¸¶Áö¸·À¸·Î, ·êÀÌ ALSOÀÇ °æ¿ì, º¯°æµÇ¾î ÀÖÁö ¾ÊÀº º»·¡ÀÇ Äõ¸® Æ®¸®¸¦ ¸®½ºÆ®¿¡ µ¡ºÙÀÏ ¼ö ÀÖ½À´Ï´Ù. Á¶°ÇºÎÀÇ INSTEAD·ê¸¸ÀÌ ÀÌ¹Ì º»·¡ÀÇ Äõ¸® Æ®¸®¿¡ Ãß°¡¸¦ Çϰí ÀÖÀ¸¹Ç·Î, 1°³ÀÇ µ¿ÀÛÀ» °¡Áö´Â ·ê¿¡ ´ëÇØ¼ 1°³ ȤÀº 2°³ÀÇ Äõ¸® Æ®¸®¿¡ °¡±î½º·Î µµÂøÇÕ´Ï´Ù.
ON INSERT·ê¿¡¼´Â, º»·¡ÀÇ Äõ¸®´Â, (INSTEAD¿¡ ÀÇÇØ Á¦Áö´çÇÏÁö ¾ÊÀº ÇÑ) ·ê¿¡ ÀÇÇØ Ãß°¡µÈ µ¿ÀÛÀÇ Àü¿¡ ½ÇÇàµË´Ï´Ù. À̰Ϳ¡ ÀÇÇØ, µ¿ÀÛÀº »ðÀÔµÈ Çà(º¹¼ö°¡´É)À» ÂüÁ¶ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ±×·¯³ª, ON UPDATE¿Í ON DELETE·ê¿¡¼´Â, º»·¡ÀÇ Äõ¸®´Â ·ê¿¡ ÀÇÇØ Ãß°¡µÈ µ¿ÀÛÀÇ µÚ¿¡ ½ÇÇàµË´Ï´Ù. À̰ÍÀº, µ¿ÀÛÀÌ °»½ÅµÉ ¿¹Á¤ÀÇ, ¶Ç´Â »èÁ¦µÉ ¿¹Á¤ÀÇ ÇàÀ» ÂüÁ¶ÇÒ ¼ö ÀÖ´Â °ÍÀ» º¸ÁõÇÕ´Ï´Ù. ±×·¸Áö ¾ÊÀ¸¸é, Á¶°Ç¿¡ ÀÏÄ¡ÇÏ´Â ÇàÀ» ã¾Æ³¾ ¼ö°¡ ¾ø±â ¶§¹®¿¡, µ¿ÀÛÀÌ ÀÛµ¿ÇÏÁö ¾Ê°Ô µÉ °¡´É¼ºÀÌ ÀϾ´Ï´Ù.
·ê µ¿ÀÛÀ¸·Î »ý¼ºµÈ Äõ¸® Æ®¸®´Â, ÀçÂ÷ ÀçÀÛ¼º ½Ã½ºÅÛ¿¡ °Ç³×Á® »ó´ç¼öÀÇ Äõ¸® Æ®¸®ÀÇ °á°ú¸¦ °¡Á®¿À´Â, º¸´Ù ¸¹Àº ·êÀÇ Àû¿ëÀ» ¹Þ´Â Àϵµ ÀÖ½À´Ï´Ù. ±×·¯´Ï±î, ·êÀÇ µ¿ÀÛÀº ·ê ÀڽŰú´Â ´Ù¸¥ ¸í·É Á¾·ù³ª, ´Ù¸¥ °á°ú ¸±·¹À̼ÇÀ» °¡Áö°í ÀÖÁö ¾ÊÀ¸¸é ¾ÈµË´Ï´Ù. ±×·¸Áö ¾ÊÀ¸¸é, ÀÌ ¹Ýº¹Àû 󸮿¡ ÀÇÇØ ¹«ÇÑ ·çÇÁ¿¡ ºüÁ® ¹ö¸³´Ï´Ù. (·êÀÇ ¹Ýº¹ Àü°³´Â °¨ÁöµÇ¾î ¿¡·¯·Î¼ º¸°íµË´Ï´Ù. )
pg_rewrite½Ã½ºÅÛ ¸ñ·ÏÀÇ µ¿ÀÛ¿¡ ÀÖ´Â Äõ¸® Æ®¸®´Â ´Ü¼øÇÑ ÅÛÇø´ÀÔ´Ï´Ù. À̰͵éÀº NEW¿Í OLD¿¡ ´ëÇÑ ¹üÀ§ Å×À̺íÀÇ Ç׸ñÀ» ÂüÁ¶ÇÒ ¼ö°¡ Àֱ⠶§¹®¿¡, »ç¿ëµÇ±â Àü¿¡ ¾î¶°ÇÑ Ä¡È¯ Á¶Ä¡°¡ ÃëÇØÁ®¾ß ÇÕ´Ï´Ù. NEW¸¦ ÂüÁ¶ÇÏ´Â ¸ðµÎ¿¡ ´ëÇØ, º»·¡ÀÇ Äõ¸®ÀÇ ´ë»ó ¸®½ºÆ®´Â ´ëÀÀÇÏ´Â Ç׸ñÀÌ ÀÖ´ÂÁö ¾ø´ÂÁö °Ë»öµË´Ï´Ù. Ç׸ñÀÌ ¹ß°ßµÇ¾úÀ» °æ¿ì¿¡´Â, ±× Ç׸ñ½ÄÀÌ ÂüÁ¶¸¦ ¿Å°Ü³õ½À´Ï´Ù. Ç׸ñÀÌ ¾ø¾ú´ø °æ¿ì, NEW´Â OLD¿Í °°Àº Àǹ̰¡ µÇ°Å³ª(UPDATEÀÇ °æ¿ì), NULL¿¡ ÀÇÇØ ¿Å°Ü³õÀ» ¼ö ÀÖ½À´Ï´Ù(INSERTÀÇ °æ¿ì). OLD¿¡ ´ëÇÑ ÂüÁ¶´Â ¸ðµÎ °á°ú ¸±·¹À̼ÇÀÎ ¹üÀ§ Å×À̺íÀÇ Ç׸ñ¿¡ÀÇ ÂüÁ¶·Î ¿Å°ÜÁý´Ï´Ù.
°»½Å ·êÀÇ Àû¿ëÀÌ ³¡³ª¸é, ½Ã½ºÅÛÀº °Å±â¼ ¸¸µé¾îÁø Äõ¸® Æ®¸®¿¡ ºä ·êÀ» Àû¿ëÇÕ´Ï´Ù. ºä´Â, »õ·Î¿î °»½Å µ¿ÀÛÀ» »ðÀÔÇÒ ¼ö ¾ø±â ¶§¹®¿¡, ºä ÀçÀÛ¼ºÀÇ °á°ú¿¡ °»½Å ·êÀ» Àû¿ëÇÒ ÇÊ¿ä´Â ¾ø½À´Ï´Ù.
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ÀÇ ´Ü°è¿¡¼ ã¾Æ³¾ ¼ö ¾ø°Ô µË´Ï´Ù.
´©±º°¡°¡ ºä¿¡ ´ëÇØ 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°¡, ½ÇÁ¦ Å×ÀÌºí¿¡¼ ¿ä±¸µÈ µ¥ÀÌÅ͸¦ »èÁ¦ÇÏ´Â, ´ÜÀÏÀÇ Äõ¸® Æ®¸®¿¡ °íÃÄ ¾µ ¼ö ÀÖ½À´Ï´Ù.
ÀÌ·¯ÇÑ ±¸Á¶°¡ ÇÊ¿äÇÑ »óȲÀº ½ÇÁ¦ »óȲ¿¡¼´Â °ÅÀÇ ¾ø´Ù°í »ý°¢µË´Ï´Ù. ±×·¯³ª, ½ÇÁ¦·Î ÀÛµ¿ÇÏ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖÀ¸¸é ¾È½ÉÇÒ ¼ö ÀÖ½À´Ï´Ù.