2010-07-27 81 views
1

我正在讀取每行包含一條記錄的文件。我正在提取文件的內容並將其作爲列值插入到表中。我面對的問題是,假設如果我從文件讀取後向表中插入記錄,我想刪除重複的字段。例如:如何在使用Perl插入表之前檢查表中的重複列值?

NAME age time 
Tom 21 10:30 
Tom 21 12:21 

插入我想要的表格後,它是:

NAME AGE TIME 
tom 21 10:30 
      12:21 

應該消除重複。如果我在創建表時添加一個唯一條件,那麼我會面臨一個問題,即明顯的時間字段未被插入,並導致MySQL中出現錯誤。

那麼我該如何做到這一點?我想要一些建議。

for my $test11 (sort keys %seen) { 
    my $test1 = $seen{$test11}{'name'}; 
    my $test2 = $seen{$test11}{'pid'}; 
    my $test3 = $seen{$test11}{'type'}; 
    my $test4 = $seen{$test11}{'time1'}; 
    print "$test11\t$test1$test2$test3$test4\n"; 
} 

#sub query_execute() 
{ 
    $db_handle = &getdb_handle; 
    $sth  = $dbh->prepare("INSERT INTO tahle_new values('$sno','$id','$test1','$test4','$test2','$test3')"); 

$test1$test2包含重複,但不是$test3

+0

請包括您在描述的每種情況下用於寫入數據庫的代碼。 – Ether 2010-07-27 06:42:11

+0

另請參閱上一個問題http:// stackoverflow。COM /問題/ 3334644 /怎麼辦,我到保持最值一列器唯一在MySQL的 - 的 - – daxim 2010-07-27 06:44:16

+0

我$ TEST11(排序鍵%可見){ 我的$測試1 = $見過{$ TEST11} { '名'}; my $ test2 = $ seen {$ test11} {'pid'}; my $ test3 = $ see {$ test11} {'type'}; my $ test4 = $ seen {$ test11} {'time1'}; print「$ test11 \ t $ test1 $ test2 $ test3 $ test4 \ n」; } #sub query_execute() { $ db_handle =&getdb_handle; $某物= $ dbh->製備( 「INSERT INTO tahle_new值( '$ SNO', '$ ID', '$ TEST1', '$ TEST4', '$ TEST2', '$ TEST3')」); – Sreeja 2010-07-27 06:49:47

回答

2

每一行都必須爲每列有一些值。你想要什麼,否則將重複爲NULL?很難想象這種桌子的實際用途。

一種方法是爲每個列添加另一個表,使其與該列不重複作爲唯一鍵;在將行添加到主表之前,嘗試將列值添加到每列表中;如果存在重複錯誤,請在嘗試添加到主表之前清除該值。

+0

注意,這是不檢測的DUP最有效的方式,但簡單做,如果做得正確應防止競爭條件。 – ysth 2010-08-02 17:11:44

4

另一種方法是在2列上定義唯一的密鑰。你的鑰匙將是(姓名,年齡)和獨特的。 所以在插入,你會得到一個錯誤,或添加到您的請求:「......對重複KEY ...」,做一些事情(或者什麼也不做;))

而作爲YSTH說,我會建議你不要插入帶空值的行作爲第二行(null,null,12:21)

1

ysth是正確的,你不應該有空值。重複表示您需要兩個表。一個用於日誌,另一個用於存儲有關用戶的信息。

CREATE TABLE user (
    id  INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    name TEXT  NOT NULL, 
    age INTEGER 
); 

CREATE TABLE log (
    user INTEGER REFERENCES user, 
    time TIME 
); 

日誌表存儲用戶的整數ID和時間(以及其他)。您需要輸入以下內容:

$dbh->do("INSERT INTO log VALUES (?,?)", undef, $uid, $time); 

在記錄日誌中的條目之前,您必須記住或獲取用戶的標識。我建議不要使用該名稱作爲關鍵字,因爲它很容易發生變化。插入用戶後,您可以使用$dbh->last_insert_id來獲取。請注意使用綁定參數以避免SQL轉義和安全問題。

+0

我沒有說他/他不應該有空值;我說很難想象一個這樣的情況,那就是想要的。實際上,我是希望能引起一些說,真正的問題是後來當數據從數據庫輸出讀取... :) – ysth 2010-07-27 17:00:50

+0

@sreeja:與查詢檢索數據庫中存儲的數據:爲了擴大這方面的更多一點。所以你可能會想要提出一個查詢,列出所有'name'是'Tom'的'時間'。通過將重複數據「NULL」化,你失去了這種能力(或者變得非常困難)。而是使用[規範化](https://en.wikipedia.org/wiki/Database_normalization)進行重複數據刪除,即將我們的常用值分解爲單獨的表格。現在你的查詢變成了連接:它們結合了兩張表中的行。這就是如何使用關係數據庫的原因。 – reinierpost 2017-08-28 21:19:14

相關問題