2012-03-28 4 views
3

ここには事があります:外部キーが重複しないようにMySQLナチュラルキーを更新するにはどうすればよいですか?

私はjQuery/php/mysqlで構築されたWebアプリケーションを持っています。タスクマネージャのようなものです。カテゴリに属する​​カテゴリとタスクがあります。 (id_category、position)

ユーザーがタスクを動かすと、位置(ajaxリクエスト)を更新する必要があります。この場合、タスクはサロゲートプライマリキー(自動インクリメントID)を持ち、データベースの一貫性はユニークです。 DB内のこのタスクの変更だけでなく、変更に関係する他のすべてのタスクの位置も示します。たとえば、位置5のタスクを位置2に移動すると、位置4〜2のタスクの位置が1つ増える必要があります。 (これは私のアプローチです;特定のカテゴリのタスクを新しいポジションで送信する人もいますが、必要なものだけを更新しようとしています)

問題は分かりませんどのように私は自然なキーの重複エラーを回避することなく、タスクの位置を更新する方法を/私は同時にすべてを更新する方法を知らない/できません。

あなたは私にそれを手伝ってもらえますか、私のアプローチを変えるべきでしょうか。ユニークインデックス(自然キー)を削除するだけで、データベースの一貫性のメカニズムがあります。

ありがとうございました。

+0

なぜautoincキーがあるときにナチュラルキーが必要ですか?それは何の目的ですか? –

+2

あなたの例では、次のようなことができます: 'UPDATE table SET position = -1 WHERE position = 5; UPDATEテーブルSET position = position + 1 WHERE position <5 AND position> 1; UPDATEテーブルのSET位置= 2 WHERE position = -1'(-1は使用されない位置を仮定) – NullUserException

+0

@TobyAllenデータベースの一貫性。 2つのタスクは同じカテゴリの同じ位置にあることはできません。私がいくつかの条件を確認しなかったので、私はアプリを構築していたときに何度か起こった。 – Amida

答えて

1
BEGIN TRANSACTION; 
SET UNIQUE_CHECKS=0; 
-- update 1 
-- update 2 
SET UNIQUE_CHECKS=1; 
COMMIT; 

する必要があります。

+0

私はそれを試してきましたが、依然として重複エラーが発生しています。 SET UNIQUE_CHECKSが動作していないようです。私はまずPHPでクエリを変更し始め、PHPMyAdminで試してみました。 例: #id5のタスクは位置1にあり、ID 41のタスクは位置2にあります。 START TRANSACTION; SET UNIQUE_CHECKS = 0; UPDATEタスクSET位置= 2 WHERE id = 5; UPDATEタスクSET位置= 1 WHERE id = 41; SET UNIQUE_CHECKS = 1; COMMIT; – Amida

+0

多くの情報をインポート(挿入)するときに、SET UNIQUE_CHECKS = 0が使用されていることがわかりました。これをオフにすると、InnoDbは一意性をチェックしないため、処理が高速化されます。しかし、彼らはアップデートでそれを使用することについて何も言わないので、あなたのコードは実際には動作できません。あなたはそれを試しましたか?一方、NullUserExceptionソリューションを試してみます。 – Amida

関連する問題