2009-03-16 5 views
1

私はここで何が間違っているのか分かりませんが、私は構文を誤解するかもしれません。私は、 "ユーザー"レコードを "ユーザー" mnesiaテーブルから "ryan"の最初の名前(それらの倍数がある)を削除しようとしています。ここで私は何をすべきかです:ここではmnesia delete_object exception?

Delete=#user{first_name = "ryan", _ = '_'}, 
mnesia:dirty_delete_object(Delete) 

は私のレコード定義である:

** exception exit: {aborted, 
         {bad_type,user, 
          {user,'_','_','_','_',"ryan",'_','_','_'}}} 
    in function mnesia:abort/1 
    in call from users:register/1 

これは完璧な試合のように思える:

-record(user, {id, 
       username, 
       password, 
       email, 
       first_name, 
       last_name, 
       last_login, % Date/time user last logged in 
       reg_date}). % Date/time user registered the account 

そして、ここでは、私が取得しています例外です。何がこの問題を引き起こす可能性がありますか?

答えて

9

mnesia:delete_object/1および/3は、表からのレコードを削除するために使用されます。 一致指定に基づいて複数のレコードは削除されません。それはちょうどmnesia:delete/*のより正確なバージョンです - の具体的なのレコードをバッグテーブルから削除する方法を提供します。 (name="ryan"とEG)の仕様に一致する複数のレコードを削除するには

は、次のコードを使用し

Delete=#user{first_name = "ryan", _ = '_'}, 
List = mnesia:dirty_match_object(Delete) 
lists:foreach(fun(X) -> 
         mnesia:dirty_delete_object(X) 
       end, List). 

をするかは、トランザクションバージョンです:削除が失敗している根本的な理由は鍵があるということである

Delete=#user{first_name = "ryan", _ = '_'}, 
Fun = fun() -> 
       List = mnesia:match_object(Delete) 
       lists:foreach(fun(X) -> 
            mnesia:delete_object(X) 
          end, List) 
     end, 
mnesia:transaction(Fun). 
+0

バインドされていません。あなたが言っているように、すべての削除操作は、キーではなく、一致で削除します。 – archaelus