- °³¿ä
- Äõ¸®ÀÇ À¯Çü
- INSERT, UPDATE, DELETE ¹®À» ¸ðµÎ »ç¿ëÇÏ´Â °æ¿ì
- UPDATE ¹® ¸¸À» »ç¿ëÇÏ´Â °æ¿ì
- Ãß°¡ÀûÀÎ °í·Á»çÇ×
- ¼Ò½º
- ¹®Á¦Á¡
1 °³¿ä
¿µ¾î·Î Àû¾î³õÀ¸´Ï ¹º°¡ ÀÖ´Â °Í °°´Ù¸¸, »ç½ÇÀº º° °Å ¾Æ´Ï´Ù. °ÔÀÓ ¼¹ö¿¡¼ ¹ß»ýÇÏ´Â Äõ¸®ÀÇ ¼ýÀÚ¸¦ ÁÙ¿©º¸ÀÚ´Â °ÍÀÌ´Ù. µ¥ÀÌÅͺ£À̽º¿¡ ÀÖ´Â ³»¿ëÀ» ¾Æ¿¹ ¸Þ¸ð¸®¿¡ °¡Áö°í Àִ ij½Ã ¼¹ö °°Àº °ÍÀ» ¸¸µå´Â °Íµµ ÁÁ°ÚÁö¸¸, ÀÏ´Ü Äõ¸® ÀÚü¸¦ ÁÙÀÌ´Â °ÍÀÌ ¹®Á¦ ÇØ°áÀÇ ÇÙ½ÉÀ̶ó°í »ý°¢ÇÑ´Ù.
2 Äõ¸®ÀÇ À¯Çü
ÀÏ´Ü SELECT ¹® °°Àº °æ¿ì¿¡´Â ij½Ã ¼¹ö°¡ ¾Æ´Ï¸é ¾î¶»°Ô ÁÙ¿©º¼ ¹æ¹ýÀÌ ¾ø´Ù. ±×·¯¹Ç·Î ÁÖ ´ë»óÀº INSERT, UPDATE, DELETE ¹®ÀÌ´Ù. ÀÌ ¼¼°¡Áö Äõ¸®¿Í Å×À̺íÀÇ °ü°è¸¦ »ý°¢ÇØ º¸¸é µÎ °¡Áö·Î ³ª´¸À» ¾Ë ¼ö ÀÖ´Ù.
2.1 INSERT, UPDATE, DELETE ¹®À» ¸ðµÎ »ç¿ëÇÏ´Â °æ¿ì
´ÙÀ½°ú °°Àº Å×À̺íÀ» »ý°¢ÇØ º¸ÀÚ.
CREATE TABLE ItemObject
(
ItemID INT NOT NULL,
UserID VARCHAR(50) NOT NULL,
ItemType INT NOT NULL,
X INT NOT NULL,
Y INT NOT NULL,
...»ý·«...
PRIMARY KEY(ItemID)
);
Ç÷¹À̾ °¡Áö°í ÀÖ´Â ¾ÆÀÌÅÛÀ» ÀúÀåÇØµÎ±â À§ÇÑ Å×À̺íÀÌ´Ù. ItemID´Â ÇØ´çÇÏ´Â ¾ÆÀÌÅÛ¸¸ÀÇ °íÀ¯ÇÑ IDÀ̰í, X,Y´Â ¾ÆÀÌÅÛÀÌ Àκ¥Å丮¿¡¼ Â÷ÁöÇÏ´Â À§Ä¡´Ù.
- Ç÷¹À̾î´Â »õ·Î¿î ¾ÆÀÌÅÛÀ» »ç¼ Àκ¥Å丮¿¡´Ù ³ÖÀ» ¼ö ÀÖ´Ù. --> INSERT
- Ç÷¹À̾î´Â ¾ÆÀÌÅÛÀ» Àκ¥Å丮 ¾È¿¡¼ ¿òÁ÷ÀÏ ¼ö ÀÖ´Ù. --> UPDATE
- Ç÷¹À̾î´Â Àκ¥Å丮¿¡ ÀÖ´Â ¾ÆÀÌÅÛÀ» »óÁ¡¿¡´Ù ÆÈ¾Æ¹ö¸± ¼ö ÀÖ´Ù. --> DELETE
¿©±â¼ Äõ¸®ÀÇ ¼ýÀÚ¸¦ ÁÙÀÏ ¼ö ÀÖ´Â ¿©Áö´Â µÎ °¡ÁöÀÌ´Ù.
- Áߺ¹µÈ UPDATE Çϳª·Î ¸¸µé±â : Ç÷¹À̾ Àκ¥Å丮 ¾È¿¡ ÀÖ´Â ¾ÆÀÌÅÛÀ» À̸®Àú¸® ¿òÁ÷ÀÎ °æ¿ì, ¸Å¹ø Äõ¸®¸¦ »ý¼ºÇÒ °ÍÀÌ ¾Æ´Ï¶ó, ÃÖÁ¾ÀûÀ¸·Î À§Ä¡°¡ È®Á¤µÇ¾úÀ» ¶§, Äõ¸®¸¦ ½ÇÇàÇÑ´Ù.
- DELETEÇÒ Çà¿¡ ´ëÇÑ INSERT ¹× UPDATE ¹«½ÃÇϱâ : Ç÷¹À̾ Àκ¥Å丮 ¾È¿¡ ÀÖ´Â ¾ÆÀÌÅÛÀ» ÆÈ¾Æ¹ö¸° °æ¿ì, ÀÌÀüÀÇ INSERT Äõ¸®³ª UPDATE Äõ¸®´Â ¹«½ÃÇÑ´Ù. »èÁ¦µÉ ¾ÆÀÌÅÛÀ» INSERTÇϰųª, UPDATEÇÏ´Â °ÍÀº ³¶ºñ´Ï±î.
2.2 UPDATE ¹® ¸¸À» »ç¿ëÇÏ´Â °æ¿ì
´ÙÀ½°ú °°Àº Å×À̺íÀ» »ý°¢Çغ¸ÀÚ.
CREATE TABLE Players
(
UserID VARCHAR(50) NOT NULL,
Gold INT NOT NULL default '0',
X INT NOT NULL,
Y INT NOT NULL,
...»ý·«...
PRIMARY KEY(UserID)
);
Ç÷¹À̾îÀÇ ¾Æ¹ÙŸ Á¤º¸¸¦ ÀúÀåÇÏ´Â Å×À̺íÀÌ´Ù. UserID´Â »ç¿ëÀÚÀÇ À̸§À̰í, Gold´Â ¼ÒÁö±Ý¾×, X,Y´Â ¸Ê ¾È¿¡¼ÀÇ ÁÂÇ¥´Ù. ÀÌ·± Á¾·ùÀÇ Å×À̺íÀº ÁÖ·Î UPDATE ¹®¸¸À» »ç¿ëÇÏ°Ô µÈ´Ù. (SELECTµµ ¾²Áö¸¸, À§¿¡¼µµ ¸»ÇßµíÀÌ ³í¿Ü·Î µÐ´Ù.)
¿©±â¼ Äõ¸®ÀÇ ¼ýÀÚ¸¦ ÁÙÀÌ·Á¸é, Äõ¸®ÀÇ Á¾·ù¸¦ ¼³Á¤ÇØ¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î ¼ÒÁö ±Ý¾× ¾÷µ¥ÀÌÆ®, ÁÂÇ¥ ¾÷µ¥ÀÌÆ® ÀÌ·± ½ÄÀÌ´Ù. ±× ´ÙÀ½ À§¿¡¼µµ ¾ð±ÞÇÑ UPDATE ¹® ÇÕÄ¡±â¸¦ Àû¿ëÇÏ´Â °ÍÀÌ´Ù. ¹°·Ð Äõ¸®ÀÇ Á¾·ù¸¦ ³ª´©Áö ¾Ê°í, ±×³É Çϳª·Î ÇØµµ µÈ´Ù. ÇÏÁö¸¸ ´ëºÎºÐÀÇ Äڵ忡¼ ÀϺΠÄ÷³¸¸À» ¼öÁ¤ÇÒ °ÍÀ̹ǷÎ, ³ª´©´Â °ÍÀÌ ÁÁÀ» µí ÇÏ´Ù.
3 Ãß°¡ÀûÀÎ °í·Á»çÇ×
¾î¶² °ÍÀÌ ÁßøµÇ´Â Äõ¸®ÀÎÁö¸¦ ÆÇ´ÜÇÒ ¶§´Â Primary Key¸¦ ÀÌ¿ëÇØ¾ßÇÑ´Ù. ´ÙÀ½°ú °°Àº ÀÏ·ÃÀÇ Äõ¸®¸¦ »ý°¢ÇØ º¸ÀÚ.
- INSERT INTO ItemObject VALUES (0, "user1", 0, 10, 9);
- UPDATE ItemObject SET X=0, Y=8 WHERE ItemID=0;
- DELETE FROM ItemObject WHERE ItemID=0;
- UPDATE ItemObject SET X=0, Y=8 WHERE ItemID=1;
ù¹øÂ° ¼¼°³ÀÇ Äõ¸®´Â Çϳª·Î ÇÕÃĵµ µÇÁö¸¸, ¸¶Áö¸· Äõ¸®´Â À§ÀÇ ¼¼ Äõ¸®¿Í ÇÕÄ¥ ¼ö ¾ø´Ù. ¿Ö³ÄÇÏ¸é ´Ù¸¥ ¾ÆÀÌÅÛ¿¡ ´ëÇÑ Äõ¸®À̱⠶§¹®ÀÌ´Ù.
4 ¼Ò½º
À§¿¡¼ ³ª¿Â ¾ÆÀ̵ð¾î¸¦ ¹ÙÅÁÀ¸·Î Á¦ÀÛÇÑ ¼Ò½º´Ù.
querybox.h
//////////////////////////////////////////////////////////////////////////////
/// \file QueryBox.h
/// \author excel96
/// \date 2004.4.29
//////////////////////////////////////////////////////////////////////////////
#ifndef __QUERYBOX_H__
#define __QUERYBOX_H__
#ifndef __NONCOPYABLE_H__
#include "Noncopyable.h"
#endif
//////////////////////////////////////////////////////////////////////////////
/// \class FullQueryBox
/// \brief INSERT, UPDATE, DELETE ¹®À» ´Ù »ç¿ëÇÏ´Â Å×ÀÌºí¿¡ ´ëÇÑ Äõ¸®¸¦
/// ÃÖÀûÈÇϱâ À§ÇØ, Äõ¸®¸¦ Àӽ÷ΠÀúÀåÇØ µÎ´Â ¹öÆÛ Ŭ·¡½º.
//////////////////////////////////////////////////////////////////////////////
template <typename K>
class FullQueryBox : private Noncopyable
{
private:
enum QueryEvent
{
QUERY_EVENT_INSERT = 0,
QUERY_EVENT_UPDATE,
QUERY_EVENT_DELETE,
QUERY_EVENT_MAX
};
private:
typedef public stdext::hash_map<K, string> EVENT_MAP;
EVENT_MAP m_pEventMap[QUERY_EVENT_MAX];
public:
FullQueryBox() {}
virtual ~FullQueryBox() { clear(); }
public:
/// \brief Äõ¸®¸¦ Ãß°¡ÇÑ´Ù.
void add(const K& key, const string& SQL)
{
Assert(!SQL.empty());
QueryEvent QE = QUERY_EVENT_MAX;
string header = SFCUtil::upper(SQL.substr(0, 6));
// Äõ¸®¹® ¾ÕºÎºÐ 6±ÛÀÚ·Î Äõ¸®ÀÇ Á¾·ù¸¦ ÆÇ´ÜÇÑ´Ù.
if (header == "INSERT") QE = QUERY_EVENT_INSERT;
else if (header == "UPDATE") QE = QUERY_EVENT_UPDATE;
else if (header == "DELETE") QE = QUERY_EVENT_DELETE;
else Assert(false);
// Äõ¸®ÀÇ Á¾·ù¿¡ µû¶ó Àû´çÇÑ ¸Ê¿¡´Ù Áý¾î³Ö¾îÁØ´Ù.
EVENT_MAP& EM = m_pEventMap[QE];
EVENT_MAP::iterator itr = EM.find(key);
if (itr == EM.end()) {
EM.insert(EVENT_MAP::value_type(key, SQL));
}
else {
itr->second = SQL;
}
}
/// \brief ¸ðµç Äõ¸®¸¦ »èÁ¦ÇÑ´Ù.
void clear()
{
for (int i=0; i<QUERY_EVENT_MAX; i++)
m_pEventMap[i].clear();
}
/// \brief °¡Áö°í ÀÖ´Â SQL¹®ÀÌ Çϳªµµ ¾ø´ÂÁöÀÇ ¿©ºÎ¸¦ ¹ÝȯÇÑ´Ù.
bool empty() const
{
for (int i=0; i<QUERY_EVENT_MAX; i++)
if (!m_pEventMap[i].empty()) return false;
return true;
}
/// \brief °¡Áö°í ÀÖ´Â SQL ¹®Àåµé¿¡ ´ëÇØ¼ ÁÖ¾îÁø ÇÔ¼öÀÚ¸¦ ½ÇÇàÇÑ´Ù.
template <typename T>
void for_each(T PRED) const
{
// Äõ¸®¹®À» »ý¼ºÇÏ´Â °úÁ¤¿¡ ÀÖ¾î¼ ¾à°£ÀÇ À¯ÀÇÁ¡ÀÌ ÇÊ¿äÇѵ¥,
// INSERT, UPDATE, DELETEÀÇ ¼ø¼´ë·Î ½ÇÇàÇØ¾ßÇÑ´Ù´Â °ÍÀÌ´Ù.
// ¾à°£¸¸ »ý°¢Çغ¸¸é ÀÌÀ¯¸¦ ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀÓÀÇÀÇ ÇàÀ» UPDATE³ª
// DELETEÇÏ·Á¸é, INSERT°¡ ¿ì¼± ½ÇÇàµÇ¾î¾ß Çϱ⠶§¹®ÀÌ´Ù.
// ¶ÇÇÑ DELETEÇÒ ÇàÀÏ °æ¿ì, INSERT³ª UPDATE¸¦ ÇÒ Çʿ䰡 ¾ø´Ù´Â °Íµµ
// »ý°¢ÇØ¾ß ÇÑ´Ù.
const EVENT_MAP& InsertMap = m_pEventMap[QUERY_EVENT_INSERT];
const EVENT_MAP& DeleteMap = m_pEventMap[QUERY_EVENT_DELETE];
for (int i=0; i<QUERY_EVENT_MAX; i++)
{
const EVENT_MAP& EM = m_pEventMap[i];
for (EVENT_MAP::const_iterator itr(EM.begin());
itr != EM.end(); itr++)
{
if (i == QUERY_EVENT_DELETE ||
DeleteMap.find(itr->first) == DeleteMap.end())
{
PRED(itr->second);
}
}
}
}
};
//////////////////////////////////////////////////////////////////////////////
/// \class PartialQueryBox
/// \brief UPDATE ¹® ¸¸À» »ç¿ëÇÏ´Â Å×ÀÌºí¿¡ ´ëÇÑ Äõ¸®¸¦ ÃÖÀûÈÇϱâ À§ÇØ,
/// Äõ¸®¸¦ Àӽ÷ΠÀúÀåÇØ µÎ´Â ¹öÆÛ Ŭ·¡½º.
//////////////////////////////////////////////////////////////////////////////
template <typename K>
class PartialQueryBox : private Noncopyable
{
private:
typedef public stdext::hash_map<K, string> EVENT_MAP;
EVENT_MAP m_EventMap;
public:
PartialQueryBox() {}
virtual ~PartialQueryBox() { clear(); }
public:
/// \brief Äõ¸®¸¦ Ãß°¡ÇÑ´Ù.
void add(const K& key, const string& SQL)
{
Assert(!SQL.empty());
Assert(SFCUtil::upper(SQL.substr(0, 6)) == "UPDATE");
EVENT_MAP::iterator itr(m_EventMap.find(key));
if (itr == m_EventMap.end()) {
m_EventMap.insert(EVENT_MAP::value_type(key, SQL));
}
else {
itr->second = SQL;
}
}
/// \brief ¸ðµç Äõ¸®¸¦ »èÁ¦ÇÑ´Ù.
void clear() { m_EventMap.clear(); }
/// \brief °¡Áö°í ÀÖ´Â SQL¹®ÀÌ Çϳªµµ ¾ø´ÂÁöÀÇ ¿©ºÎ¸¦ ¹ÝȯÇÑ´Ù.
bool empty() const { return m_EventMap.empty(); }
/// \brief °¡Áö°í ÀÖ´Â SQL ¹®Àåµé¿¡ ´ëÇØ¼ ÁÖ¾îÁø ÇÔ¼öÀÚ¸¦ ½ÇÇàÇÑ´Ù.
template <typename T>
void for_each(T PRED) const
{
for (EVENT_MAP::const_iterator itr(m_EventMap.begin());
itr != m_EventMap.end(); itr++)
{
PRED(itr->second);
}
}
};
#endif //__QUERYBOX_H__ »ç¿ë¹ý
/// Ç÷¹À̾î¿Í °ü·ÃµÈ µ¥ÀÌÅͺ£À̽º º¯°æ À̺¥Æ®µé
enum PlayerEvent
{
PLAYER_EVENT_GOLD, ///> µ· º¯°æ
PLAYER_EVENT_COORD, ///> ÁÂÇ¥ º¯°æ
PLAYER_EVENT_MAX ///> ¹è¿À» À§ÇÑ ¸Æ½º°ª
};
typedef FullQueryBox<ItemID_t> ITEM_BOX;
typedef PartialQueryBox<PlayerEvent> PLAYER_BOX;
struct FOR_EACH_QUERY
{
list<string>& SQL_LIST;
FOR_EACH_QUERY(list<string>& sl)
: SQL_LIST(sl) {}
FOR_EACH_QUERY(const FOR_EACH_QUERY& other)
: SQL_LIST(other.SQL_LIST) {}
void operator()(const string& SQL)
{
SQL_LIST.push_back(SQL);
}
};
...
/// \brief ¾ÆÀÌÅÛ °ü·Ã Äõ¸®¸¦ »ý¼ºÇؼ ¹öÆÛ¿¡´Ù Áý¾î³Ö´Â´Ù.
void addItemQuery(ITEM_BOX& IB, Item* pItem, ...)
{
IB.add(pItem->getItemID(), generateItemSQL(pItem, ...));
}
/// \brief ÁÖ±âÀûÀ¸·Î ¹öÆÛ¿¡ µé¾îÀÖ´Â Äõ¸®µéÀ» ½ÇÇàÇÑ´Ù.
void save(ITEM_BOX& IB)
{
...
list<string> sql_list;
IB.for_each(FOR_EACH_QUERY(sql_list));
IB.clear();
for (list<string>::const_iterator itr(sql_list.begin());
itr != sql_list.end(); itr++)
{
executeQuery(*itr, ...);
}
...
}
5 ¹®Á¦Á¡
Áߺ¹ Äõ¸® Á¦°Å´Ï ¹¹´ÏÇÏ°í ¸»ÇßÁö¸¸, °á±¹ ¿ä¾àÇÏÀÚ¸é Äõ¸®¸¦ ¹öÆÛ¸µÇÏ´Â ÀÏÀÌ´Ù. ¼¹ö°¡ ´Ù¿îµÇ°Å³ª Çϸé, ¹öÆÛ¿¡ µé¾îÀÖ´ø Äõ¸®´Â ¸ù¶¥ ³¯¾Æ°¡¹ö¸°´Ù. À½. ´Ù¿îµÇ¾îµµ ³¯¾Æ°¡Áö ¾Ê´Â Äõ¸®¸¦ ¸¸µé ¼ö ÀÖÀ»±î?
SeriousMoin v1 (koMoinMoin 1.0a4 Modified)