<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>哇寶部落格 &#187; mysql</title>
	<atom:link href="http://blog.wabow.com/archives/tag/mysql/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.wabow.com</link>
	<description>Wabow Information Inc. Blog</description>
	<lastBuildDate>Fri, 20 Jan 2012 09:19:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>[mysql] MySQL 5.0 的 Stored Procedure</title>
		<link>http://blog.wabow.com/archives/1117</link>
		<comments>http://blog.wabow.com/archives/1117#comments</comments>
		<pubDate>Thu, 14 May 2009 03:08:13 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[技術分享]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://blog.wabow.com/?p=1117</guid>
		<description><![CDATA[MySQL 在 5.0 版後，增加了 Stored Procedure 的功能， 讓 MySQL 能夠真正的具備大型商用資料庫的架勢。根據維基百科的說明，Stored Procedure 預存程式是一種在資料庫中儲存的程式，同時也是可供外部程式呼叫的一種資料庫物件，可以視為資料庫中的函數或子程式。透過它的幫助，首先我們能夠減少使用外部程式（如 PHP）時，因多次 Query 資料庫而花費的往返時間；而且 Stored Procedure 儲存在資料庫時，可以視為已經編譯完成的程式，所以在執行效能上比一般 SQL Query 更為迅速。其次由於它存在資料庫中，因此如果有多個外部程式必須同時應用到這個程式時，只要呼叫同一支 Stored Procedure 即可；不需要因為更換外部程式而重新撰寫程式，大大的提升程式的可維護性。不過受限於它是於資料庫中使用的程式，當然在可用的變數型態，以及支援的函數上都遠不如真正的程式語言；所以只適合用在簡單不複雜的一般邏輯判斷上。左圖是 O'Reilly 於 2006 年出版的《MySQL Stored Procedure Programming》；雖然並沒有中文版，不過 O'Reilly 願意專門為 MySQL 的 Stored Procedure 出書，這個功能對於開發者來說的重要性可見一斑。 稍微簡單介紹一下 Stored Procedure 大概的使用方式，雖然說是資料庫中的程式，但是使用的語法仍是非常的 SQL Like。在開始之前，首先我們必須重新定義 MySQL 的結束符號；因為內建的結束符號是「;」，而 Stored Procedure 的語法會頻繁的使用到「;」。所以必須變更它： -- 網路上比較常看到的方式是變更成「//」，當然也可以用任何其他喜歡的符號代替 DELIMITER // 接下來當然是 CREATE [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.wabow.com/wp-content/uploads/2009/05/0596100892_lrg.jpg"><img class="alignleft size-medium wp-image-1118" src="http://blog.wabow.com/wp-content/uploads/2009/05/0596100892_lrg-228x300.jpg" alt="O'reilly 的 MySQL Stored Procedure Programming" width="228" height="300" /></a><a href="http://www.mysql.com/" target="_blank">MySQL</a> 在 5.0 版後，增加了 <a href="http://dev.mysql.com/doc/refman/5.0/en/stored-programs-defining.html" target="_blank">Stored Procedure</a> 的功能， 讓 MySQL 能夠真正的具備大型商用資料庫的架勢。根據<a href="http://zh.wikipedia.org/w/index.php?title=%E5%AD%98%E5%82%A8%E7%A8%8B%E5%BA%8F&amp;variant=zh-tw" target="_blank">維基百科的說明</a>，Stored Procedure 預存程式是一種在資料庫中儲存的程式，同時也是可供外部程式呼叫的一種資料庫物件，可以視為資料庫中的函數或子程式。透過它的幫助，首先我們能夠減少使用外部程式（如 PHP）時，因多次 Query 資料庫而花費的往返時間；而且 Stored Procedure 儲存在資料庫時，可以視為已經編譯完成的程式，所以在執行效能上比一般 SQL Query 更為迅速。其次由於它存在資料庫中，因此如果有多個外部程式必須同時應用到這個程式時，只要呼叫同一支 Stored Procedure 即可；不需要因為更換外部程式而重新撰寫程式，大大的提升程式的可維護性。不過受限於它是於資料庫中使用的程式，當然在可用的變數型態，以及支援的函數上都遠不如真正的程式語言；所以只適合用在簡單不複雜的一般邏輯判斷上。左圖是 O'Reilly 於 2006 年出版的《<span class="b"><a href="http://my.safaribooksonline.com/0596100892" target="_blank">MySQL Stored Procedure Programming</a>》；雖然並沒有中文版，不過</span> O'Reilly 願意專門為 MySQL 的 Stored Procedure 出書，這個功能對於開發者來說的重要性可見一斑。</p>
<p><span id="more-1117"></span>稍微簡單介紹一下 Stored Procedure 大概的使用方式，雖然說是資料庫中的程式，但是使用的語法仍是非常的 SQL Like。在開始之前，首先我們必須重新定義 MySQL 的結束符號；因為內建的結束符號是「;」，而 Stored Procedure 的語法會頻繁的使用到「;」。所以必須變更它：</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">-- 網路上比較常看到的方式是變更成「//」，當然也可以用任何其他喜歡的符號代替</span>
DELIMITER <span style="color: #CC0099;">//</span></pre></div></div>

<p>接下來當然是 CREATE 一個 PROCEDURE 囉：</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">-- 建立一個名為 test 的 PROCEDURE，可以帶入數字型態的 var1 與 var2 二個參數</span>
<span style="color: #990099; font-weight: bold;">CREATE</span> <span style="color: #990099; font-weight: bold;">PROCEDURE</span> test<span style="color: #FF00FF;">&#40;</span>var1 <span style="color: #999900; font-weight: bold;">INT</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">10</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">,</span> var2 <span style="color: #999900; font-weight: bold;">INT</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">10</span><span style="color: #FF00FF;">&#41;</span><span style="color: #FF00FF;">&#41;</span>
<span style="color: #990099; font-weight: bold;">BEGIN</span>
&nbsp;
<span style="color: #808080; font-style: italic;">-- 處理的邏輯寫在這裡，BEGIN 與 END 中間的區塊</span>
&nbsp;
<span style="color: #808080; font-style: italic;">-- 特別注意，在 END 之後必須加上我們先前重新定義的結束符號，表示 PROCEDURE 的結尾</span>
<span style="color: #009900;">END</span><span style="color: #CC0099;">//</span></pre></div></div>

<p>在處理的邏輯中定義變數：</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">-- 定義變數及其型態，同時也可以選擇性的給予預設值；供 PROCEDURE 處理時暫存使用</span>
<span style="color: #990099; font-weight: bold;">DECLARE</span> <span style="color: #990099; font-weight: bold;">value</span> <span style="color: #999900; font-weight: bold;">INT</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">10</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">DEFAULT</span> <span style="color: #008080;">0</span><span style="color: #000033;">;</span></pre></div></div>

<p>為變數賦值：</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">-- 設定變數的值</span>
<span style="color: #990099; font-weight: bold;">SET</span> <span style="color: #990099; font-weight: bold;">value</span> <span style="color: #CC0099;">=</span> var1 <span style="color: #CC0099;">*</span> var2<span style="color: #000033;">;</span></pre></div></div>

<p>PROCEDURE 提供簡單的邏輯判斷，如：IF 判斷、WHILE 迴圈等：</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">-- 使用 IF 進行數值大小的判斷</span>
<span style="color: #009900;">IF</span> <span style="color: #990099; font-weight: bold;">value</span> <span style="color: #CC0099;">&amp;</span>lt<span style="color: #000033;">;</span> <span style="color: #008080;">10</span> <span style="color: #009900;">THEN</span>
    <span style="color: #990099; font-weight: bold;">SELECT</span> <span style="color: #008000;">'value &amp;lt; 10'</span><span style="color: #000033;">;</span>
ELSEIF <span style="color: #990099; font-weight: bold;">value</span> <span style="color: #CC0099;">&amp;</span>gt<span style="color: #000033;">;</span><span style="color: #CC0099;">=</span> <span style="color: #008080;">10</span> <span style="color: #CC0099; font-weight: bold;">AND</span> <span style="color: #990099; font-weight: bold;">value</span> <span style="color: #CC0099;">&amp;</span>lt<span style="color: #000033;">;</span><span style="color: #CC0099;">=</span> <span style="color: #008080;">20</span> <span style="color: #009900;">THEN</span>
    <span style="color: #990099; font-weight: bold;">SELECT</span> <span style="color: #008000;">'value between 10 and 20'</span><span style="color: #000033;">;</span>
<span style="color: #009900;">ELSE</span>
    <span style="color: #990099; font-weight: bold;">SELECT</span> <span style="color: #008000;">'value &amp;gt; 20'</span><span style="color: #000033;">;</span>
<span style="color: #009900;">END</span> <span style="color: #009900;">IF</span><span style="color: #000033;">;</span></pre></div></div>

<p>所以一個完整的 Stored Procedure 寫法會是：</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">-- 如果存在時先刪除 PROCEDURE</span>
<span style="color: #990099; font-weight: bold;">DROP</span> <span style="color: #990099; font-weight: bold;">PROCEDURE</span> <span style="color: #009900;">IF</span> <span style="color: #990099; font-weight: bold;">EXISTS</span> test<span style="color: #000033;">;</span>
<span style="color: #808080; font-style: italic;">-- 重新定義結束符號</span>
DELIMITER <span style="color: #CC0099;">//</span>
&nbsp;
<span style="color: #808080; font-style: italic;">-- 建立一個名為 test 的 PROCEDURE，可以帶入數字型態的 var1 與 var2 二個參數</span>
<span style="color: #990099; font-weight: bold;">CREATE</span> <span style="color: #990099; font-weight: bold;">PROCEDURE</span> test<span style="color: #FF00FF;">&#40;</span>var1 <span style="color: #999900; font-weight: bold;">INT</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">10</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">,</span> var2 <span style="color: #999900; font-weight: bold;">INT</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">10</span><span style="color: #FF00FF;">&#41;</span><span style="color: #FF00FF;">&#41;</span>
<span style="color: #990099; font-weight: bold;">BEGIN</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">-- 處理的邏輯寫在這裡，BEGIN 與 END 中間的區塊</span>
    <span style="color: #808080; font-style: italic;">-- 定義變數</span>
    <span style="color: #990099; font-weight: bold;">DECLARE</span> <span style="color: #990099; font-weight: bold;">value</span> <span style="color: #999900; font-weight: bold;">INT</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">10</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">-- 變數賦值</span>
    <span style="color: #990099; font-weight: bold;">SET</span> <span style="color: #990099; font-weight: bold;">value</span> <span style="color: #CC0099;">=</span> var1 <span style="color: #CC0099;">*</span> var2<span style="color: #000033;">;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">-- 邏輯判斷</span>
    <span style="color: #009900;">IF</span> <span style="color: #990099; font-weight: bold;">value</span> <span style="color: #CC0099;">&amp;</span>lt<span style="color: #000033;">;</span> <span style="color: #008080;">10</span> <span style="color: #009900;">THEN</span>
        <span style="color: #990099; font-weight: bold;">SELECT</span> <span style="color: #008000;">'value &amp;lt; 10'</span><span style="color: #000033;">;</span>
    ELSEIF <span style="color: #990099; font-weight: bold;">value</span> <span style="color: #CC0099;">&amp;</span>gt<span style="color: #000033;">;</span><span style="color: #CC0099;">=</span> <span style="color: #008080;">10</span> <span style="color: #CC0099; font-weight: bold;">AND</span> <span style="color: #990099; font-weight: bold;">value</span> <span style="color: #CC0099;">&amp;</span>lt<span style="color: #000033;">;</span><span style="color: #CC0099;">=</span> <span style="color: #008080;">20</span> <span style="color: #009900;">THEN</span>
        <span style="color: #990099; font-weight: bold;">SELECT</span> <span style="color: #008000;">'value between 10 and 20'</span><span style="color: #000033;">;</span>
    <span style="color: #009900;">ELSE</span>
        <span style="color: #990099; font-weight: bold;">SELECT</span> <span style="color: #008000;">'value &amp;gt; 20'</span><span style="color: #000033;">;</span>
    <span style="color: #009900;">END</span> <span style="color: #009900;">IF</span><span style="color: #000033;">;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">-- 特別注意，在 END 隻後必須加上我們先前重新定義的結束符號，表示 PROCEDURE 的結尾</span>
<span style="color: #009900;">END</span><span style="color: #CC0099;">//</span></pre></div></div>

<p>建立完成之後，只要在 MySQL 中使用：</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">CALL</span> test<span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">3</span><span style="color: #000033;">,</span><span style="color: #008080;">5</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span></pre></div></div>

<p>就可以看到<a class="wpGallery" href="http://blog.wabow.com/wp-content/uploads/2009/05/stored_procedure_result.png">結果</a></p>
<p>當然除了簡單的顯示外，處理邏輯中也可以使用新增、修改，甚至是建立資料表等等 SQL 語法；在資料統計彙整的使用上，相當的方便呢！雖然在邏輯能力以及函數的使用上遠遠不及真正的程式語言，但是在統計簡單重複性的資料時，執行的效能比其他外部程式要優秀的多！同時因為 Stored Procedure 是儲存於資料庫中，當統計的方式變動時只要修改它，而不需要對聯結同一個資料庫而使用不同的外部程式做個別的修改；大大的提升可維護性。</p>
<p>感謝 Neo 與 Jace 的說明，以及網路上前輩們的文章；以後在處理大量統計資料時，又多了一種可以選擇的解決方案囉！^^</p>
<p>參考資料：</p>
<ul>
<li>php &amp;&amp; mysql <a href="http://totou-phpmysql.blogspot.com/2008/06/stored-procedure.html" target="_blank">stored procedure</a></li>
<li> 逆思考 <a href="http://blog.yam.com/eviles/article/19155487" target="_blank">[MySQL] 用Stored Procedures寫個小程式</a></li>
<li>ptt Database版 slalala 分享並繁中化，西安電子科技大學 陳朋弈 譯：<a href="http://blog.wabow.com/wp-content/uploads/2009/05/mysql-storedprocedure-translation.pdf" target="_blank">MySQL-StoredProcedure-Translation</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.wabow.com/archives/1117/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[mysql] 5.0版新支援的view--8個錯誤的設定</title>
		<link>http://blog.wabow.com/archives/956</link>
		<comments>http://blog.wabow.com/archives/956#comments</comments>
		<pubDate>Thu, 16 Apr 2009 08:13:49 +0000</pubDate>
		<dc:creator>andrew</dc:creator>
				<category><![CDATA[技術分享]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://blog.wabow.com/?p=956</guid>
		<description><![CDATA[緣起 之前公司的某個現有客戶想要追加新功能，因為當初這個專案並沒有參與到，所以就花了一些時間在研究資料庫結構及功能流程。在看mysql發現到有使用到以前沒有接觸過的view的概念，就上網找了些資料來詳讀。或許對很多使用非mysql資料庫的程式設計師來說，view的概念其實很簡單甚至覺得不需要特別寫這篇文章；但是其實mysql是一直到5.0版才開始支援view的概念，也因為不支援view而造成在其他資料庫轉入mysql時造成小小的困擾。這篇文章主要會介紹在撰寫view的語法時要特別注意的8個錯誤，就讓我們開始吧! 何謂view 依據筆者的瞭解，所謂的view就是把專案中常使用的sql語法存入到mysql裡，如此在程式撰寫sql語法上可以簡化，不需要每次都要寫一堆語法。舉個例子來說，以往我們要串兩張資料表撈取其中一張表的某欄位時，我們通常會寫成： select tableA.name from tableA,tableB where tableA.id=tableB.id; 如果每次都需要這樣寫稍嫌麻煩。我們改用view的概念先把tableA與tableB先關連起來建立了一個view叫做v_tableA_tableB，以後我要撈取tableA的name欄位值時，就可以簡單寫成： select name from v_tableA_tableB; 而達到同樣的目的。也就是說，我們可以先把一些常用的sql語法用view的方式存到mysql裡，之後要使用時只要針對這個建立的view去作存取即可。那我們該如何在mysql中建立一個view呢?來看下一段的說明。 如何建立一個view 以上一段的範例中，如果要建立v_tableA_tableB這個view，我們會寫成： CREATE VIEW v_tableA_tableB AS select tableA.name from tableA,tableB where tableA.id=tableB.id; create view v_tableA_tableB 表示我們要建立一個名稱叫v_tableA_tableB的view；AS 後面會接上要使用的sql語法，如此就很簡單的建立了一個view。那麼，在建立view的時候，有沒有什麼要注意的地方呢?下一段讓我們來看看本篇文章的重點--8個錯誤的設定吧! 8個錯誤的設定 1.不能對暫存資料表建立view mysql &#62; CREATE TEMPORARY TABLE tt (col1 INT); mysql &#62; CREATE VIEW v AS select * from tt; //-------(X) mysql中不允許對一個暫存資料表建立view，這已經是一種標準。 [...]]]></description>
			<content:encoded><![CDATA[<h3>緣起</h3>
<p>之前公司的某個現有客戶想要追加新功能，因為當初這個專案並沒有參與到，所以就花了一些時間在研究資料庫結構及功能流程。在看mysql發現到有使用到以前沒有接觸過的view的概念，就上網找了些資料來詳讀。或許對很多使用非mysql資料庫的程式設計師來說，view的概念其實很簡單甚至覺得不需要特別寫這篇文章；但是其實mysql是一直到5.0版才開始支援view的概念，也因為不支援view而造成在其他資料庫轉入mysql時造成小小的困擾。這篇文章主要會介紹在撰寫view的語法時要特別注意的8個錯誤，就讓我們開始吧!<br />
<span id="more-956"></span></p>
<h3>何謂view</h3>
<p>依據筆者的瞭解，所謂的view就是把專案中常使用的sql語法存入到mysql裡，如此在程式撰寫sql語法上可以簡化，不需要每次都要寫一堆語法。舉個例子來說，以往我們要串兩張資料表撈取其中一張表的某欄位時，我們通常會寫成：</p>
<blockquote><p>select tableA.name from tableA,tableB  where tableA.id=tableB.id;</p></blockquote>
<p>如果每次都需要這樣寫稍嫌麻煩。我們改用view的概念先把tableA與tableB先關連起來建立了一個view叫做v_tableA_tableB，以後我要撈取tableA的name欄位值時，就可以簡單寫成：</p>
<blockquote><p>select name from v_tableA_tableB;</p></blockquote>
<p>而達到同樣的目的。也就是說，我們可以先把一些常用的sql語法用view的方式存到mysql裡，之後要使用時只要針對這個建立的view去作存取即可。那我們該如何在mysql中建立一個view呢?來看下一段的說明。</p>
<h3>如何建立一個view</h3>
<p>以上一段的範例中，如果要建立v_tableA_tableB這個view，我們會寫成：</p>
<blockquote><p>
CREATE VIEW v_tableA_tableB AS select tableA.name from tableA,tableB  where tableA.id=tableB.id;</p></blockquote>
<p>create view v_tableA_tableB 表示我們要建立一個名稱叫v_tableA_tableB的view；AS 後面會接上要使用的sql語法，如此就很簡單的建立了一個view。那麼，在建立view的時候，有沒有什麼要注意的地方呢?下一段讓我們來看看本篇文章的重點--8個錯誤的設定吧!</p>
<h3>8個錯誤的設定</h3>
<p>1.不能對暫存資料表建立view</p>
<blockquote><p>mysql &gt; CREATE TEMPORARY TABLE tt (col1 INT);<br />
mysql &gt; CREATE VIEW v AS select * from tt;   //-------(X)</p></blockquote>
<p>mysql中不允許對一個暫存資料表建立view，這已經是一種標準。</p>
<p>2.在同一個資料庫中table與view不能同名</p>
<blockquote><p>mysql &gt; CREATE TABLE tt (col1 INT);<br />
mysql &gt; CREATE VIEW tt AS select * from tt;   //-------(X)</p></blockquote>
<p>在同一個資料庫中，table與view是共用同一個命名空間，所以在命名上要注意不得重複。</p>
<p>3.不能對不存在的table建立view</p>
<blockquote><p>mysql &gt; CREATE VIEW tt AS select * from no_such_table;   //-------(X)</p></blockquote>
<p>雖然在Oracle中可以用FORCE這個參數避掉這個錯誤，不過mysql中並不允許。其實mysql的作法更趨近標準。</p>
<p>4.不能針對沒有權限的資料表建立view<br />
簡單來說，假使某使用者對tableA沒有權限可控管時，在建立tableA的view時同樣也會出現權限不足的錯誤訊息。</p>
<p>5.建立view中不得使用變數或是參數</p>
<blockquote><p>mysql &gt; CREATE VIEW v AS select * tt<br />
         -&gt; WHERE s1 = @variable AND s2 = ? ; //-------(X)<br />
ERROR 1351 (HY000) : View's SELECT contains a variable or parameter</p></blockquote>
<p>如果在建立view的語法中加上變數或參數，馬上就會回傳錯誤訊息造成建立失敗，這個在標準化的sql語法中都是如此設定的。</p>
<p>6.在from 中不得包含子查詢 (sub-query)</p>
<blockquote><p>mysql &gt; CREATE VIEW tt AS select * from<br />
         -&gt; (SELECT s1 FROM t1) AS x;             //-------(X)<br />
ERROR 1394 (HY000) : View's SELECT contains a subquery in the FROM clause</p></blockquote>
<p>在建立view的語法中，如果在from後面加上子查詢 (sub-query)會發生錯誤。這個在其他資料庫如Oracle其實是允許的。</p>
<p>7.不能在view中使用同樣的欄位名稱</p>
<blockquote><p>mysql &gt; CREATE  TABLE tt (col1 INT);<br />
mysql &gt; SELECT col1,col1 FROM tt;<br />
mysql &gt; CREATE VIEW v AS select col1,col1 from tt;  //-------(X)<br />
ERROR 1060 (42S41) : Duplicate column name 'col1'</p></blockquote>
<p>在範例中如果我們在一般的table中下同名的col1去select是不會發生錯誤的，但在view則不行。在view的欄位名稱必須是唯一的。</p>
<p>8.欄位數量錯誤</p>
<blockquote><p>mysql &gt; CREATE VIEW v (s1) AS select s1,s2 from tt;  //-------(X)<br />
ERROR 1353 (HY000) : View's SELECT and view's field list have different column counts</p></blockquote>
<p>如果在view的欄位與select中的欄位數不一致時也會造成建立view的錯誤。</p>
<h3>總結</h3>
<p>在看了以上的說明後，相信應該對view的正確設定上會有更深的認識。其實關於view的相關資料還有很多，這篇文章僅針對一些容易發生錯誤的設定上做了簡略的介紹，不論是官方文件或是網路上都可以找到更多關於view的資料，有興趣的人不妨可以去找來看看。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wabow.com/archives/956/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>在 MySQL 資料庫找出 Email 格式不正確的信箱</title>
		<link>http://blog.wabow.com/archives/267</link>
		<comments>http://blog.wabow.com/archives/267#comments</comments>
		<pubDate>Sun, 08 Mar 2009 17:14:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[技術分享]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://blog.wabow.com/?p=267</guid>
		<description><![CDATA[整理資料庫時，總會遇到 Email 格式不正確的問題。這時只要利用 MySQL 的正規式就可以輕鬆找出有問題的 Email 了。 SELECT * FROM `users` WHERE email NOT REGEXP '^[a-zA-Z0-9][a-zA-Z0-9._+-]*[a-zA-Z0-9_-]@[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9]+..[a-zA-Z]{2,4}$' (感謝 Ori Pekelman 發表的語法，以上有稍做修改) 說明: @ 前的帳號分為「頭身尾」三段，頭只能為英數字，身可以用 + 及 . 號，身末可以用 _ 及 - @ 後的網路位址同樣拆頭身尾檢查格式，必須至少有一個 . ，並且最後一個 . 後面接的必須是 2 或 4 個英文字 (如 .tw 或 .info)]]></description>
			<content:encoded><![CDATA[<p>整理資料庫時，總會遇到 Email 格式不正確的問題。這時只要利用 MySQL 的正規式就可以輕鬆找出有問題的 Email 了。</p>
<p><span class="syntax"><span class="syntax_alpha syntax_alpha_reservedWord">SELECT</span> <span class="syntax_punct">*</span><br />
<span class="syntax_alpha syntax_alpha_reservedWord">FROM</span> <span class="syntax_quote syntax_quote_backtick">`users`</span><br />
<span class="syntax_alpha syntax_alpha_reservedWord">WHERE</span> <span class="syntax_alpha syntax_alpha_identifier">email</span> <span class="syntax_alpha syntax_alpha_reservedWord">NOT</span><br />
<span class="syntax_alpha syntax_alpha_reservedWord">REGEXP</span> </span><span class="syntax"> <span class="syntax_quote syntax_quote_single">'^[a-zA-Z0-9][a-zA-Z0-9._+-]*[a-zA-Z0-9_-]@[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9]+..[a-zA-Z]{2,4}$'</span></span></p>
<p><span class="syntax"><span class="syntax_quote syntax_quote_single"><span id="more-267"></span></span></span></p>
<p><span><span>(感謝 <a href="http://dev.af83.com/sql/validate-email-addresses-in-mysql-with-a-pure-select/2007/05/15/">Ori Pekelman</a> 發表的語法，以上有稍做修改)</span></span></p>
<p><span><span>說明:<br />
</span></span></p>
<ul>
<li><span><span>@ 前的<strong>帳號</strong>分為「頭身尾</span></span><span><span>」三段，頭只能為英數字，身可以用 + 及 . 號，身末可以用 _ 及 -</span></span></li>
<li><span><span>@ 後的<strong>網路位址</strong>同樣拆頭身尾檢查格式，必須至少有一個 . ，並且最後一個 . 後面接的必須是 2 或 4 個英文字 (如 .tw 或 .info)</span></span></li>
</ul>
<p><!--<br />
參考<br />
http://dev.af83.com/sql/validate-email-addresses-in-mysql-with-a-pure-select/2007/05/15/<br />
--></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wabow.com/archives/267/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>啟動 MySQL 的 log 紀錄功能</title>
		<link>http://blog.wabow.com/archives/54</link>
		<comments>http://blog.wabow.com/archives/54#comments</comments>
		<pubDate>Thu, 14 Aug 2008 02:08:12 +0000</pubDate>
		<dc:creator>andrew</dc:creator>
				<category><![CDATA[技術分享]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://blog.wabow.com/?p=54</guid>
		<description><![CDATA[1.找到mysql的設定檔my.cnf(通常是放在/etc/my.cnf) 2. 在[mysqld]下方加上一行 log = {存放log的路徑/log檔名} 3.重新啟動mysql &#62; /etc/init.d/mysql restart 4.開啟步驟2設定的log檔.會發現所有mysql有執行過的指令都寫在裡面 [point] 如果重新啟動mysql發現log檔沒有在指定路徑下產生.請依照下面建議: 1.確認目前機器上mysql使用的設定檔my.cnf是否是步驟1修改的. 2.確認後還是沒有產生的話.建議建立新的資料夾.並設定owner為mysql:mysql. 記得my.cnf中也要比照修改到新的路徑 (會有此情況是因為資料夾權限的關係)]]></description>
			<content:encoded><![CDATA[<p>1.找到mysql的設定檔my.cnf(通常是放在/etc/my.cnf)</p>
<p>2. 在[mysqld]下方加上一行</p>
<p>log = {存放log的路徑/log檔名}</p>
<p>3.重新啟動mysql &gt; /etc/init.d/mysql restart</p>
<p>4.開啟步驟2設定的log檔.會發現所有mysql有執行過的指令都寫在裡面</p>
<p>[point]</p>
<p>如果重新啟動mysql發現log檔沒有在指定路徑下產生.請依照下面建議:</p>
<p>1.確認目前機器上mysql使用的設定檔my.cnf是否是步驟1修改的.</p>
<p>2.確認後還是沒有產生的話.建議建立新的資料夾.並設定owner為mysql:mysql.</p>
<p>記得my.cnf中也要比照修改到新的路徑</p>
<p>(會有此情況是因為資料夾權限的關係)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wabow.com/archives/54/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

