VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

insert into的靈異問題

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
goodnight



註冊時間: 2008-10-13
文章: 472
來自: 台南市

第 1 樓

發表發表於: 星期五 四月 12, 2019 2:36 pm    文章主題: insert into的靈異問題 引言回覆

請問各位先進
最近發生一個問題, 以下的程式, 在 ht002tmp 完全被刪除的情況下, insert into 會將最後一筆的資料寫入

程式是連續執行, 執行完後, 我去檢查 hr002tmp.dbf, 確是都已 delete
代碼:

set delete on
DELETE hr002tmp FROM hr003 where hr003.員工編號=hr002tmp.員工編號

INSERT INTO hr003 ;
( 部門編號, 部門名稱, 員工編號, 員工姓名, 門禁卡號, 離職日期, 新光到職日) ;
SELECT 部門編號, 部門名稱, 員工編號, 員工姓名, 門禁卡號, 離職日期, 新光到職日 ;
FROM HR002TMP WHERE (NOT DELETED())


但我改成以下後, 就能正常 (應該是 0 筆)
代碼:

set delete on
DELETE hr002tmp FROM hr003 where hr003.員工編號=hr002tmp.員工編號
* ==================
* 輸入這段, 就能正確
SELECT HR002TMP
GO TOP
* ==================
INSERT INTO hr003 ;
( 部門編號, 部門名稱, 員工編號, 員工姓名, 門禁卡號, 離職日期, 新光到職日) ;
SELECT 部門編號, 部門名稱, 員工編號, 員工姓名, 門禁卡號, 離職日期, 新光到職日 ;
FROM HR002TMP WHERE (NOT DELETED()) 


我想請問一下, 第一段的程式為什麼會有靈異的現象? 資料表都已 delete 了, 為何還會抓到最後一筆?
是因為hr002tmp記錄指標沒有更新的關係嗎? 所以要藉移動指標來讓資料表正確??

p.s: 都是 .dbf

_________________
希望有更多人來參與
VFP wiki - 需要大家一起完成的VFP電子書與FAQ
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 雅虎訊息通 MSN Messenger
CPS0204



註冊時間: 2014-08-24
文章: 441


第 2 樓

發表發表於: 星期六 四月 13, 2019 8:52 am    文章主題: 引言回覆

DELETE hr002tmp FROM hr003 where hr003.員工編號=hr002tmp.員工編號
**********
上述 有問題,DELETE 再用連結的方法,會有問題!
好奇怪的用法我都沒用過: DELETE A.DBF FROM B.DBF WHERE ..........................
4/15補充說明:
delete a from b where.....肯定會有問題!說不定會造成 .null. 然後大亂
不是應該寫為: delete a.dbf where a.custno in (select b.custno from b.....)...

剛查一下MS-SQL指令 ,沒有 DELETE A FROM B 這種寫法
應是VFOXPRO 特別的寫法,我猜是有漏洞且沒有更新版本!才會造成怪怪的不穩定結果!
建議不要寫成這種語法,要刪除就很簡單的刪除就好,不需要,(刪除且又關聯式),造成自身的麻煩,又浪費自己的時間,不是多此一舉嗎?

改成這樣或許比較好:
DELETE hr002tmp where hr002tmp.員工編號 in (select 員工編號 from hr003)


CPS0204 在 星期二 四月 16, 2019 8:17 am 作了第 6 次修改
回頂端
檢視會員個人資料 發送私人訊息
goodnight



註冊時間: 2008-10-13
文章: 472
來自: 台南市

第 3 樓

發表發表於: 星期一 四月 15, 2019 9:47 am    文章主題: 引言回覆

CPS0204 寫到:
DELETE hr002tmp FROM hr003 where hr003.員工編號=hr002tmp.員工編號
**********
上述 有問題,DELETE 再用連結的方法,會有問題!
好奇怪的用法我都沒用過: DELETE A.DBF FROM B.DBF WHERE ..........................


現在你學到了, 呵呵

_________________
希望有更多人來參與
VFP wiki - 需要大家一起完成的VFP電子書與FAQ
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 雅虎訊息通 MSN Messenger
goodnight



註冊時間: 2008-10-13
文章: 472
來自: 台南市

第 4 樓

發表發表於: 星期一 四月 15, 2019 10:17 am    文章主題: 引言回覆

暫時用我能理解的方式找到問題所在

測試1:
DELETE hr002tmp FROM hr003 where hr003.員工編號=hr002tmp.員工編號
? DELETED(), 員工編號, 員工姓名


結果:
.T. S0537 通行證190


測試2
SELECT hr002t
DELETE FROM hr003t where hr002t.員工編號=hr003t.員工編號
? DELETED(), 員工編號, 員工姓名


結果:
.F.


結論是
如果不是DELETE hr002tmp FROM hr003 where hr003.員工編號=hr002tmp.員工編號 的語法有問題, 就是我自己對語法的認知有問題

既然最後都要 SELECT HR002T , 不如就直接以測試2的語法工作
只是今天再測試, 資料又正常了, 有沒有可能是索引在做怪呢?

只能附上測試用的資料表

_________________
希望有更多人來參與
VFP wiki - 需要大家一起完成的VFP電子書與FAQ
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 雅虎訊息通 MSN Messenger
marvin



註冊時間: 2004-06-01
文章: 321


第 5 樓

發表發表於: 星期一 四月 15, 2019 6:53 pm    文章主題: 引言回覆

建議盡量用 simple, stupid, 簡單, 不會錯的方式去寫

sub query 個人記為出錯了也不易發覺

而且 VFP 不會再有新版, 以前的 bug 不會改變, 還是用傳統, 安全的寫法比較好.
回頂端
檢視會員個人資料 發送私人訊息
violetlkk



註冊時間: 2003-06-21
文章: 82
來自: kaohsiung

第 6 樓

發表發表於: 星期二 四月 16, 2019 1:30 am    文章主題: 引言回覆

DELETE hr002tmp FROM hr003 where hr003.員工編號=hr002tmp.員工編號

是不是緩衝造成的
delete 可能是一筆一筆刪
到了最後一筆時 , 還沒真正寫入擋案
必須移動record 才會真正刪除最後一筆資料
go top 就是移動record
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
goodnight



註冊時間: 2008-10-13
文章: 472
來自: 台南市

第 7 樓

發表發表於: 星期二 四月 16, 2019 12:08 pm    文章主題: 引言回覆

violetlkk 寫到:
DELETE hr002tmp FROM hr003 where hr003.員工編號=hr002tmp.員工編號

是不是緩衝造成的
delete 可能是一筆一筆刪
到了最後一筆時 , 還沒真正寫入擋案
必須移動record 才會真正刪除最後一筆資料
go top 就是移動record


有可能, 以前看過有人在說, 某些動作要透過重新移動指標後, 資料才會更新
例如移動記錄指標, skip , go top , go bottom 都可以, 看需求, 印象中沒有說到緩衝
所以我才會有這種印象, 也許真的是bug 也說不定

本來想偷懶的, 不過因為有關聯的關係, 用這樣的語法蠻方便的, 知道有問題, 就下個go top 就好了, 要再短一點, 用 skip in hr002tmp 就好了

_________________
希望有更多人來參與
VFP wiki - 需要大家一起完成的VFP電子書與FAQ
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 雅虎訊息通 MSN Messenger
goodnight



註冊時間: 2008-10-13
文章: 472
來自: 台南市

第 8 樓

發表發表於: 星期二 四月 16, 2019 12:11 pm    文章主題: 引言回覆

marvin 寫到:
建議盡量用 simple, stupid, 簡單, 不會錯的方式去寫

sub query 個人記為出錯了也不易發覺

而且 VFP 不會再有新版, 以前的 bug 不會改變, 還是用傳統, 安全的寫法比較好.


謝謝您的說明, 會這樣寫, 純粹是為了想偷懶程式碼~~以後會多注意,
以後若遇到像有 delete 的動作, 會多加一道程式來確保正確性以策安全
謝謝您~~

_________________
希望有更多人來參與
VFP wiki - 需要大家一起完成的VFP電子書與FAQ
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 雅虎訊息通 MSN Messenger
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作