- ベストアンサー
INSERTとWHEREについて
- INSERT文を入れるとエラーになってしまいます。当たっているように思えるのですが、どこが間違っているのでしょうか??ご教示、お願いいたします。
- DBのデータを追加する際、INSERT文を使用することが多いですが、この場合、追加するデータがすでに存在していた場合にはエラーが発生します。このエラーが発生している可能性がありますので、データがすでに存在しているかどうかを確認してください。
- また、WHERE句を使用する場合には、対象のレコードが存在するテーブルを指定する必要があります。ご提供いただいたクエリでは、WHERE句の前にテーブル名が指定されていないように見受けられますので、テーブル名を指定することで解決するかもしれません。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
idが2っていう条件があるわけだからupdateかreplaceでしょ? すでにあるデータのところにinsertできるわけないのだから insertに条件をつけること自体、理論的にまちがってますよね? http://dev.mysql.com/doc/refman/4.1/ja/insert.html
その他の回答 (4)
- chukenkenkou
- ベストアンサー率43% (833/1926)
#2、#3回答者です。 いくつかのRDBMSに関しては専門的な知識を持っているのですが、面倒だからか、 問題の本質に迫らなくて、「こうやればいいよ!」的な回答をすることがあります。 そういった時、yambejpさんが問題の本質について回答しているのを見て、ある意味、「専門家として恥ずかしかったかな?」と感じることもあります。 正規化されていないデータベースは、操作性にいろいろな問題が生じるだけでなく、規模が大きくなればなるほど、性能を出すことが難しくなります。 データ量が数千件くらいまでなら、なんとかなるかも知れませんが、数十万件、数百万件といったオーダーになれば、DB設計の見直しは必須になります。
- yambejp
- ベストアンサー率51% (3827/7415)
review用のテーブルを別途つくって、 idとreviewをどんどん追加していけばよいでしょう。 「正規化」というキーワードでいろいろ調べてみてください
- chukenkenkou
- ベストアンサー率43% (833/1926)
>また、そこにどんどん追記していきたいです。 >たとえばこんな感じです。○○○を追記 >+------+----------+----------------+----------+ >| id | name | osusume | review | >+------+----------+----------------+----------+ >| 1 | エイリアン | NULL | おもしろい | >| 2 | スパイダーマン | NULL | ☆☆☆☆☆○○○ | >+------+----------+----------------+----------+ 列値を、どんどん文字連結して行きたいということですね。 そういった管理方法では、操作性が悪くなりますよ? まず、希望する操作ですが、以下のようなSQLで実現できます。 update movie set review=concat(if(review is null,"",concat(review,0x0000)),'追加する値') where id=2 null値が入っている場合、文字連結の結果もnullなので、最初に判定して「''」(長さ0の文字)を入れてから、文字連結します。 通常、レビュー間の区切りが必要でしょうから、この場合、0x0000を入れています。 レビューだけが増えていき、書込み者やお勧め度等が増えないというのが、ちょっと分かりませんが。。。 こういう表を作る場合は、一般的にはレビュー部分を別の表に分けたり、レビュー通番等を付けて、別の行にします。
お礼
文字連結初めて分かりました。ありがとうございます! やはり操作性悪いですか・・無理やりですものね・・ もういちど考え直してみます。 みなさん、ありがとうございました^^
- chukenkenkou
- ベストアンサー率43% (833/1926)
何をやりたいのか、イマイチ分からないのですが? どんどん追加していくなら、insert文です。 既存のデータを書き換えるなら、update文です。 MySQLには、拡張機能として、replace文があります。 insert文には、大きく分類して、 insert into 表名[(列名リスト)] values(値リスト) と insert into 表名[(列名リスト)] select文 という書き方があります。 後者は、定数などの値だけでなく、他の表や既存の行の値を拾って格納する方法です。 しかし、質問にある誤った記述である「where id=2」で、何をしたくてそういう記述を思いついたのかが分かりません。 id=2の行データと、追加したいデータに、関連性がなんら見えませんが?
お礼
関連性が見えないですか・・・すみません やりたかったことはidが2の行データのみ、レビューを追記したいのです。星の部分です。 +------+----------+----------------+----------+ | id | name | osusume | review | +------+----------+----------------+----------+ | 1 | エイリアン | NULL | おもしろい | | 2 | スパイダーマン | NULL | ☆☆☆☆☆ | +------+----------+----------------+----------+ また、そこにどんどん追記していきたいです。 たとえばこんな感じです。○○○を追記 +------+----------+----------------+----------+ | id | name | osusume | review | +------+----------+----------------+----------+ | 1 | エイリアン | NULL | おもしろい | | 2 | スパイダーマン | NULL | ☆☆☆☆☆○○○ | +------+----------+----------------+----------+ 私何か勘違いしているのでしょうか・・・・
お礼
なるほど・・・! 勉強不足でした、ありがとうございます^^ ではreviewを追記していくにはどうすればよいのでしょう?? レビューですからどんどん追加して書き足したいのです。 updateではもともとのレビューは消えてしまいますよね。