2012-03-29 8 views
1

レコードの配列、つまり複数のレコードを保存すると、中央のレコードの1つにエラー(SQL)がある場合、どうなりますか?以後、すべてのレコードが挿入されないか、現在の行のみ、またはまったく挿入されませんか?どのように状況を処理する必要がありますか?前回のクエリでエラーが発生した場合、後で何が起こるか

PDOドライバは、MySQL

+2

どのようなエラーが発生しますか?そして、どのRDBMS? –

+0

私はSQLエラーはいくつかのフィールド/レコードがNULLだと言っているが、データベースごとには – aWebDeveloper

+0

ではいけません。最初の問題(エラー)を開始するとMysqlが終了します –

答えて

1

一般的な解決策はTRANSACTION(mysql)(pgsql)(mssql)を使用することです。あなたがそれを使って何をすることができ、どのくらいの制御を持っているかは、RDBMSに依存します。たとえば、PostgreSQLではSAVEPOINTを作成できます。これにはROLLBACK TOを指定できます。

もう1つの解決策は、STORED PROCEDUREです。その場合、エラーが発生した場合に何が起こるかを指定できますDECLARE .. HANDLER

+0

私は現在のerrorsomeクエリの実行以外のものを続けたい...そうなるだろう – aWebDeveloper

+0

いいえ、MySQLのトランザクションではできませんこの。あなたのケースのストアドプロシージャは実行可能ではないかもしれません。常に準備された文を作成し、その文を新しいデータのループで実行することができます。エラーが発生した場合、 'execute()'メソッドは 'false'を返します。 –

2

PDO-取引を見てみましょうです:http://php.net/manual/en/pdo.begintransaction.php

あなたはエラーがあったかどうかをチェックし、ので、あなたのコミットをロールバックしたり、

+0

エラーがある場合はロールバックする必要がありますトランザクションのない別のクエリかどうか –

+0

はい、私はあなたがその文書を読むのに助言します。 – worenga

+0

ありがとう、@ satoshi良い例があります。http://stackoverflow.com/a/9925679/744255 –

2
をするつもり何でもあればできます

これらの状況はdatabase transactionsで管理されます。

古典的な例は、私の口座から別の口座にお金を移したいときです。

  1. アカウント
  2. からお金を削除し、他のアカウントもちろん​​

にお金を入れて2番目のクエリが失敗した場合、私は最初のものにしたい:やるべき2つのクエリがあります。ロールバックしてユーザーにエラーを通知します。それがトランザクションの目的です。

トランザクションを使用しない場合、2番目のクエリが失敗すると、最初のクエリは実行され、ロールバックされません(したがって、金額は消えます)。これはMySQLのデフォルト動作です。

+0

+1です。 –

+0

私は現在のerrorsomeクエリの実行以外のものを続行したい...そうなるだろう – aWebDeveloper

関連する問題