2012-02-27 6 views
1

レコードが追加されたときに、そのカラムをプライマリキーと同じ値にしたい場合、その直後にレコードを更新する必要はありませんこれを行う良い方法がありますか?私は現在やっている何をMySQLで追加するときに[auto-increment]プライマリキーと同じカラムを使用する

$db->query("INSERT INTO 'mytable' SET ..."); 
$db->query("UPDATE 'mytable' SET someColumn=".$db->insert_id." WHERE id=".$db->insert_id); 

私はそれが可能であれば、だけではなく、このための2つのいずれかのクエリを実行されてやりたいです。

私は現在間違っていますか?必ずしもそうではありません。コーディングのための新しい方法を学ぶことが常に良いので、私はこれをやりたいだけです。 :)

+2

データを複製する理由を説明できますか?あなたはすでにデータベースにデータを持っています。なぜそれを2回欲しいのか分かりません。 – SenorAmor

+0

問題が発生しない場所であれば、これを使用する理由は考えられません。 – Crashspeeder

+0

私はそれが記入された後にデータの注文のためにそれを使用しています(重複列)。ほんの少しの手間で、より良い方法を知っているなら、私は提案をすることができます。 –

答えて

1

INSERT INTO ... SET?それは間違っている。 < - いいえ、それは間違っていない、私はばかだった。

もし可能であれば、CASCADE foreing key constraintを作成します。

+0

私は先週自分自身で初めてINSERT INTO ... SETを見ました。それは完全に有効であるようです。 – Crashspeeder

+0

ええ、私はそれを今でも見ますが、それでも私にとっては奇妙です。 :) –

+0

私はこれを試してもよいかもしれませんが、もしそれが可能であれば幾分面倒です。その間、私はMySQLのドキュメントを見ています。そのINSERT INTO ... SETを削除するまで、 –

2

someColumnの場合、常にidに等しくなりますが、無駄な非正規化です。クエリーではsomeColumnの代わりにidを単に使用する必要があります。

適切なRDBMSで、またはアプリケーション側で主キーを生成している場合は、キー値ジェネレータを使用して、idsomeColumnの両方の列に同じ値を設定できます。 MySQLのAUTO_INCREMENTハックがスレッドセーフSQLシーケンスに似たものを提供しているかどうかはわかりませんが、いずれにしても、documentation pagesの具体的な内容は、AUTO_INCREMENT brainf quirkであなたに役立つ標準的な知識や経験がないため、おそらく読む必要があります。

また、someColumn(またはブール値の列)の特別な値は、「ちょうど挿入/使用idの値」を意味します。

+0

キー・ジェネレータはあまりにも悪くはないと思いません。そのことを念頭に置いておきます。ありがとうございました。 –

+0

また、 "someColumn = LAST_INSERT_ID()+ 1"というクエリを使用することができますが、これは恐ろしいことではありません。誰でもこれを使用することに異論はありますか? –

+1

同期されません。単に2つの同時挿入がそれを壊すでしょう。 – aib

1

あなただけのid列とまったく同じそれはシーケンシャル必ずしも必要な場合は、あなたができる:

INSERT INTO mytable SET foo = (select max(foo) + 1 from mytable) 

をさておき、これは私には危険に見える通り:

$db->query("UPDATE 'mytable' SET someColumn=".$db->insert_id." WHERE id=".$db->insert_id); 

pdoを使用していると仮定して、プリペアドステートメント/バインドされたパラメータを使用して常に値をクエリにバインドします。例えば。;

$stmt = $db->prepare("UPDATE 'mytable' SET someColumn = :someColumn WHERE id = :id"); 
$stmt->execute(array(":someColumn" => $db->insert_id, ":id" => $db->insert_id)); 
関連する問題