【この先一体】MySQL 総合 Part15【どうなるの】
601 :
NAME IS NULL :
2009/08/02(日) 19:54:52 ID:jeLofuXy table1(元データ),table2(フラグ定義),table3(table1の各項目にフラグをぶら下げる)があって、 table1の一部の項目にフラグがついた状態になっています。 これを結合して、フラグの有無にかかわらず全項目を表にしたいと考えています。 select (略) from table1 left join (table2 inner join table3 on table2.id=table3.id) on table1.flag=table3.flag; とすると、フラグがNULLのものが表に出てきません。 どうしたらいいでしょうか?
602 :
NAME IS NULL :2009/08/02(日) 20:48:28 ID:J20WEjYY
テーブル名とかフィールド名って、何文字くらいを上限にしてますか?
mysqlの設定中に手詰まりしたので助けてくれ 状況:WindowsからMysqlAdministratorを使用してログインしようとしたらエラー Mysql Error Number 2003(Can't Connect to MySQL server on 'IPアドレス' サーバー OS:Centos5(x64) Xenにて仮想化 Domein FILESERVER DATABASE WEB Enforceは全てDISABLEDにしてある ローカルからデータベースへの接続は可能なんだがリモートでの接続がエラーが 出て上手くいかない ぐぐってみたら /etc/my.conf の bind-addressが127.0.0.1 をコメントアウトしろとか書いてあるが… うちの設定にはそもそも無かったw あと考えられる部分って何だろう? 数日悩んでいて多分単純な事に気づいていないだけだと思うんだが
604 :
NAME IS NULL :2009/08/03(月) 17:58:37 ID:77U0plNm
考えられること:お前がバカだということ
SELinux iptables ping mysqladmin ping
>>603 接続に使用しようとしているMYSQLユーザのホストはどうなってる?
localhostや127.0.0.1だったら繋がらない。
MySQLの日付型はyyyy-mm-dd hh:nn:ss形式のようですが、 面倒な変換なしにyyyy/mm/ss hh:nn:ss型を使えないでしょうか?
>>607 そのまま格納は無理だろう。
表示はdate_format使え。
>>607 update や insert で更新する値としてなら使える。
select で取り出す値は date_format() でも使わないと無理。
610 :
603 :2009/08/04(火) 08:44:28 ID:???
>>604-606 アドバイスサンクス!
その辺りの事を全て確認してみたがダメだった
原因の切り分けが出来ないから一度仮想化せずに設定して問題なければ
仮想化してチャレンジしてみるよ
612 :
603 :2009/08/04(火) 12:36:22 ID:???
>>611 それも当然確認したw
馬鹿で間違いないw
613 :
NAME IS NULL :2009/08/04(火) 20:05:58 ID:CvqNEHZq
mysqladminで文字コードをutf8からsjisに変えたのに、 status;をみると何種類もあるうちの1つしかsjisになっておらず、残りはutf8のまま。 全部変えたいときはどこいじればいいの?
またまたかまってちゃん登場
616 :
NAME IS NULL :2009/08/05(水) 00:36:41 ID:dQ/gDRRx
3.28くらいから5.0にmyisamのファイルをバイナリレベルのコピーで持ってきたんだけど、 varcharの解釈がバイトレベルから文字数レベルになったから、 そのままだと途中で切れちゃう。 そこで一旦3.28側でvarcharを2倍にしてから持ってきたら問題なかった。 一応これで動いてるけど、本当に問題ないのかな?
617 :
NAME IS NULL :2009/08/05(水) 04:06:22 ID:AIBVsZem
素直にダンプ&ロードした方がすっきりするが・・
618 :
NAME IS NULL :2009/08/05(水) 21:15:27 ID:9eWVh/Lf
select * from user WHERE id = $user この時$userに1jとか入れてもid1を抽出してくるのなぜですか?
仕様に決まってんだろカス
複素数入力しても整数に暗黙のキャストされるんだよ。 MySQLの開発者は電気系な。
621 :
NAME IS NULL :2009/08/06(木) 00:11:24 ID:4Rgx9kKE
MySQL WorkbenchでER図書いているんだけど、 ひょっとしてテーブル作った後に、テーブルのスキーマ変更できない・・・?
622 :
NAME IS NULL :2009/08/06(木) 18:48:04 ID:XYQGPPAG
できるわけねーだろボケ
いやできるだろ ALTER TABLE で. 内部的には全部作り直しているみたいだけど.
全文検索を早くしたいと思って、上で出ていたTritonn(windows版)を導入したんですが、ちょっと動作的な質問です。 TelNo varchar(11) fulltext index using ngram, normalize (TelNo) の中に、以下のようなデータがはいってたとします。 0123-45-6789 1234-56-7890 234-567-7890 1234567890 0123-556789 これを select count(*) from sample where match(TelNo) against("7890"); とすると 1234-56-7890 234-567-7890 は抽出するけど 1234567890 は非抽出なんです。 ちなみに fulltext index using ngram,no normalize (TelNo) とすれば抽出するようです。 正規化機能って数字羅列は無理なんですか?
625 :
621 :2009/08/06(木) 23:04:39 ID:4Rgx9kKE
>>622 >>623 すまん、テーブル作った後にという表現が悪かった。
既に複数のテーブルを定義してあるんだけど、
ER図の上での定義としてスキーマを変更したいんだけど
やり方が分からない。
ERWinとかERStudioならテーブルのプロパティに、スキーマの
定義があって変更すれば済む。
ちなみに1テーブルづつなら、コピーしたテーブルをスキーマタブに
ペーストする事で実現できたんだけど、本来は複数テーブルと
それに紐づくリレーションをまとめてスキーマ移動したいのです。
Windows2003環境で OSからメモリ不足エラー(Got Error 12)が頻発するんだけど、 設定ファイルのどの項目のメモリ量減らせば解決できますか? ただ、タスクマネージャ見ても搭載メモリの半分も使ってないのに このエラーが出るので何かほかのところが間違っている気もするんですが... どなたかわかる方教えてください。
具体的におこなった操作とエラーの内容を書け
629 :
627 :2009/08/07(金) 18:39:51 ID:???
>628
そうだよな、すまない
基本的にInsertとSelectしかしてないです。
大きめのテキストファイルを解析して投げているので、
Insertはものによっては100kb以上なってると思う。
登録されているデータは12GBほど@Mysql\dataフォルダの容量なのでアバウト
登録データが増えるほど頻発するようになった。
表示されたエラーは(たぶんSelect発行時)
「Got error 12 from storage engine」
これが出るとサービス再起動しか復帰できない...
設定はVineとかに入ってる設定サンプルを参考に文字コードとかかを変更したもの
ttp://vine-linux.ddo.jp/linux/sql/mycnf.php こういうの
メモリは2G積んでるから
初めはhugeでやってたけどmediumでも同じ症状が出るから
今はsmallでなんとか安定してうごいてる。
MySQLのバージョンは5.0とすこし古めです
うざくて読む気がしない
631 :
624 :2009/08/07(金) 22:02:24 ID:???
>>626 ありがとうございました。
やりたい事ができました。
>>629 2GBじゃ足りないってことだろう。つーかselectでコケてるのわかってんなら
クエリかインデックスを見直すべきじゃないかなぁ。
>>629 たぶん、mysqld が必要とするメモリを確保できない。
my.cnf のパラメータみなおして、メモリ使用量少なめになるように調整してみては?
634 :
633 :2009/08/07(金) 23:16:04 ID:???
>>629 ああ、small で安定してるのか。ゴミレスごめん。
ごみレスは629
636 :
NAME IS NULL :2009/08/10(月) 00:55:17 ID:WJlH4sRX
運用中のdbのカラム変更ってどういう手順でしてますか? 外部から接続してこないようにポート塞いでから変更→ポート開けるとか?
637 :
NAME IS NULL :2009/08/10(月) 12:30:26 ID:xYYENRj3
Handler_read_rnd_nextが赤文字になるのは仕様? リセットかけても直ぐに赤文字になるんだけど。。
638 :
NAME IS NULL :2009/08/10(月) 17:51:56 ID:umkbwiYM
しようがない
質問です。 2つのテーブルを比較して、指定したカラムのデータが完全に一致することを チェックするには、どうするのがいいでしょうか。
2つのテーブルを比較して、指定したカラムのデータが完全に一致することをチェックすればいいんじゃないかな
うん、そうだね
642 :
NAME IS NULL :2009/08/14(金) 23:19:48 ID:QWmtJHHL
MySQLで複数テーブルを一気にcreate tableしたいのですが マクロとかありますか?
>>642 同じ構造のテーブルをたくさん作りたいのかな。
シェルスクリプトでもperlでもVBAでもいいので、自分で書いちゃダメ?
>>643 システムの初期導入設定時に複数のcrate tableのSQLを一括で
実行してDB本番環境をすばやく構築したいのです。
一個一個のテーブルを手でcreate tableするのは出来ますが
テーブル数が多いのでマクロかなんかで一括で実行出来たら良いなと。
個々のcreate tableのsqlファイルは既にあります。
OracleだとPL/SQLとかでやってると思いますがMySQLではどうしてるのかなと。
645 :
644 :2009/08/15(土) 00:20:46 ID:???
>>644 ファイルがあるのなら、
cat *.sql | mysql
でいいんじゃね?
と思ったら、解決したのか。
サーバAにmysqlが入っていて、サーバBから接続したい場合は どれをインスコするの? サーバB自体にはDBを持たず、接続するだけの場合。 例) mysql testdb -h サーバA -u test -p < test.sql > out.txt MySQL-client-communityだけ? MySQL-develも必要?
mysqlコマンド使うだけならclientのみ。 PerlとかCから繋ぐならsharedも必要、 繋ぐものをソースからビルドするならdevelも必要
649 :
NAME IS NULL :2009/08/19(水) 03:47:47 ID:dChAbBgf
MYIファイルが肥大化してきたので整理しようと思うのですが 行を削除した段階ではMYIファイルは縮まないですよね? 削除後MYIファイルを縮めるには、myisqmchkでsort-indexするでOKですか? あるいは他に方法があれば教えてください
optimize tableでもできたはず
651 :
647 :2009/08/19(水) 13:00:14 ID:???
652 :
NAME IS NULL :2009/08/19(水) 13:00:53 ID:7XUHkeqC
質問です、長くなりますがお願いします。 スケジューラをphp5とmysql5で作っています。関連するテーブルは2つあって、 【sche_info_tb 基本的な情報用】 id, day, eventName 【sche_player_tb 各イベントの参加者用、evIdはsche_info_tbのidです】 id, evId, player こんな感じです。(それぞれもっとカラムありますが省略してます。参加者は不定数なので、テーブル分離必須?です) これで、スケジュール一覧のカレンダーを作るときどうやってクエリしたら良いのか迷っています。 カレンダーの構成要素は開催日(sche_info_tb.day)、イベント名(sche_info_tb.eventName)、 参加者名(sche_player_tb.player)です。 自分の考えでは、 1)SELECT * FROM `sche_info_tb` を実行 2)返ってきた結果に対してforeachをまわして一つずつidを取得 3)それをつかって SELECT * FROM `sche_player_tb` WHERE `evId`=$id を実行 という感じです。 しかし、これじゃクエリの実行回数が多過ぎる気がします。ひと月30日として、30回。 1日に複数イベント登録したらもっと増えます。 何か、賢いやり方ないでしょうか? スケジューラアプリはいろんなサイトにありますが、全部こんなやり方してるんでしょうか? これが普通ですか? 初心者なりに考えて作ってるつもりですが、不出来なところがあれば教えていただけると幸いです。 よろしくお願いします。
テーブルのJOINをしたことありませんか? select i.day, i.eventName, p.player from sche_info_tb i, sche_player_tb p where i.id = p.evId and i.day between '2009-08-01' and '2009-08-31' ;
オレはLEFT JOINを多用しているけど、知人はINNER JOINを多用していると言われた。 INNER JOINのほうが使いやすいのかな・・・ もちろん状況にもよるだろうけど。
655 :
NAME IS NULL :2009/08/19(水) 16:03:34 ID:7XUHkeqC
>>653 ,654
うわー、すごい!
聴いたことはあったんですが理解できなくて手を付けていませんでした。>JOIN
こういう状況で使うんですね。 自分でもう一度確認し直します、ありがとうございました!
ほんとにJOINしたことなかったんだw がんばってください
>>654 オレは、LEFT OUTER JOINばっかり。
それだけといっても過言ではない。
INNERとかCROSSとかいろいろあるけど、
使うべきケースがまったくわかんね。orz
JOINとかサブクエリーとか覚えると世界が広がるからガンガレ
659 :
NAME IS NULL :2009/08/19(水) 20:57:38 ID:fdU1p2ON
ストアドプロシージャでのエラー処理で教えてください。 プロシージャ内で、 insert into hoge (id, name) values(_id, _name); といったクエリを発行し、データを登録しています。 このときに、insertの結果(正否)を取得するにはどうしたらいいでしょうか? sybaseとかだと、@@sql_statusとかで直前のクエリのステータスを取得できたと思います。 mysqlの場合はどのようにしたらいいでしょう。 5.0.45-log MYISAM です。よろしくお願いします。
660 :
652 :2009/08/20(木) 20:15:50 ID:W0DXzN4C
>>653 さんのクエリでjoinを教えてもらってお世話になったものです。
自分で、
select t1.*, t2.* from table1 t1, table2 t2 where~~
としてクエリを実行したところ、返り値の中にidが2つある状態になりました
echo $rs[0]['id']とやると、一つ目のidを出力します。
明示的に「一つ目の重複カラムを表示する」あるいは、
クエリ発行時に出力対象から特定のカラムを除外する方法はないでしょうか?
すみませんがアドバイスお願いします。
>>658 サブクエリ教えてくれてありがとうございました
これは便利ですね!
アスタリスクで書いたらそうなるね。 手抜きしないで select t1.id, t1.hoge, t1.fuga, t2.foo, t2.bar と必要な列だけ書きましょう。 ちなみにうちの会社では「select *」はコーディング規約で禁止されてます。
662 :
652 :2009/08/20(木) 20:56:57 ID:???
>>661 それしかないんですか…
全部で50個くらいカラムがあるんだけどそれでも個別に書いてくってことですよね?
大変だなぁ。。
とりあえずそうします、ありがとうございました。
663 :
NAME IS NULL :2009/08/20(木) 20:57:29 ID:oS//lB2K
>>659 どうも調べてみたら、declare handlerで例外処理をキャッチで着るみたいね。
これでインサートエラーをトラップできそう。
664 :
NAME IS NULL :2009/08/20(木) 21:00:12 ID:oS//lB2K
>>662 そんなもん、クラス化(ライブラリか)しておいたらいいでしょう。
また、最初の一発目も、desc テーブル名とかでカラムリストとって、
整形すればさほど難しくはない。
なにより、*で手抜きだけはするなと言うこと。それをやったら許さんぞ。
665 :
652 :2009/08/20(木) 21:10:59 ID:???
>>664 クラス化っていうのはphpとかのプログラム側で関数化するってことですよね?(mysqlの用語ではなくて)
>最初の一発目も、desc テーブル名とかでカラムリストとって
ってなんですか?
クラス内のクエリ文を手作業で、t1.col1,t1.col2,t1.col3,t1.col4,…って書いていく時に、
テーブル構造を出力して見ながらやろうっていう事ですよね?
>>665 見ながらやるんじゃなくて、テーブル構造をコピペしてテキストエディタかなんかでマクロを使うか、
sed等で置換するかして機械的な処理で整形してください。
という意味です。がんばってね。ここで手を抜かないことが大事だよ。
667 :
652 :2009/08/20(木) 21:58:17 ID:???
>>666 あー、なるほど! よくわかりました、ありがとう!
あちゃー オレも面倒なときはつい * を使ってしまうわw * と 個別にカラムを指定するのって速度的に違いはあるのかな? 感覚的に * のほうが処理速度は速そうだけど・・・。
select対象列がすべてインデックスの中に入っていると、 テーブルアクセスをスキップできるのでとても速い。 select *してしまうと実テーブルを読まざるを得ない。 カバーリングインデックスというテクニックです
>>669 へえー、そう言う事情があるんですか
今試してみたら両方のやり方で速度の差なかったけど、何十万件になると違いが出るんでしょうか。。
どうもありがとう
テーブルがメモリに入りきらなくなるあたりから差が出るよ
MySQL 5.1 にて CREATE TABLE `word_count` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `word` varchar(12) NOT NULL, `count` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `word` (`word`) ) と言うテーブルで、 select * from word_count where instr('ここに文章が入ります',word); を実行すると、key が使われなくて速度が出ません。 もっと効率よくできる書き方はありませんか?
>>673 全文検索とは逆のことがしたいのですよ。
instr('words',word) を早くしたいのです。
全部見るしかないからむりじゃね
TRIEとか使えないの?
質問です MySQL5.4の機能であるBKAを使用したのだが 併せてsennaの日本語全文検索機能も使いたいと思っています。 5.4にはsennnaのパッチが当てられないので困っていますが 対応方法ほか良い案などありますでしょうか。 現在はTorittonの5.0,67を使ってますが外部結合が遅い・・・
679 :
NAME IS NULL :2009/08/29(土) 19:06:41 ID:odCioAfi
MySQL Clusterって使ってる人いる? これってDB鯖を複数立ち上げて外側では1つに見せるってものだよね 家で試験するとして 最低3台PCいるかな DB 1号 DB 2号 クラスタ管理 1号
トリガーについて教えてください MySQL 5.1.35 Windows を使って勉強中なんですけど table shouhin_master ←マスターテーブル code int name varchar(20) 〜 delete_flg tinyint table data_tbl ←データテーブル code int data1 〜 外部制約でshouhin_masterからcodeを消した時 data_tblの該当するcodeデータを消すようにはしているのですが。 マスターテーブルのdelete_flg に9を立てた時にトリガーを使って data_tblの該当するcodeのデータを削除する事出来ますか? 出来るとしたら、どういうトリガーを書けば良い?
>>679 パフォーマンス試験じゃなければ、そういう構築例は仮想マシンでやればいいから1台あればいいんじゃね?
>>680 NewとかOldとか使え
begin
if new.delete_flg = 9 then
delete from data_tbl where code = new.code;
end if;
end
684 :
名無しさん@そうだ選挙に行こう :2009/08/30(日) 08:59:50 ID:8Tmsiy4Z
テーブルを4つjoinする方法がわかりません。アドバイスお願いします。 eventTbl id/kaijouId/eventName sankashaTbl id/eventId/userId/comment kaijouTbl id/kaijouName userTbl id/userName 条件は以下です。 eventTbl.id = sankashaTbl.eventId eventTbl.kaijouId = kaijouTbl.id sankashaTbl = userTbl.id この状況の時にそれぞれのカラムを全て引き出したいです どう書いたら良いんでしょうか? userTbl以外の3つまでは以下のようにして出来たんですが。。 SELECT eventTbl.eventName, sankashaTbl.comment, kaijouTbl.kaijouName FROM (eventTbl LEFT JOIN sankashaTbl ON eventTbl.id=sankashaTbl.eventId) LEFT JOIN kaijouTbl ON eventTbl.kaijouId=kaijouTbl.id これからさらにどうしたら良いでしょうか? FROM ((eventTbl LEFT JOIN sankashaTbl ON eventTbl.id=sankashaTbl.eventId) LEFT JOIN kaijouTbl ON eventTbl.kaijouId=kaijouTbl.id) LEFT JOIN sanashaTbl ON sankashaTbl.userId=userTbl.id としたらエラーしました
? userTblをJOINしてなきゃ、そりゃエラーになるだろう
686 :
名無しさん@そうだ選挙に行こう :2009/08/30(日) 09:47:03 ID:8Tmsiy4Z
どこでJOINしたら良いんでしょうか? 3つまでの解説はよく見かけるんですが、4つ以上は見つけられなくて困ってます
687 :
名無しさん@そうだ選挙に行こう :2009/08/30(日) 09:47:43 ID:8Tmsiy4Z
お礼書き忘れた。
>>685 ありがとうございます
どこでも何も、そのまま続けて書けばいい。 FROM 〜 JOIN 〜 JOIN 〜 JOIN 〜 解説以前に、まずはマニュアル読むべき。
689 :
名無しさん@そうだ選挙に行こう :2009/08/30(日) 13:14:43 ID:8Tmsiy4Z
>>688 ありがとうございます
ずっとマニュアルは読んでるんですが、どうも理解できなくて。。
すみません、教えてください お願いします
690 :
名無しさん@そうだ選挙に行こう :2009/08/30(日) 13:46:04 ID:LriVeEv0
phpからmysqlのテーブルに格納されている文字列をmysql_fetch_rowだとかmysql_fetch_assocだとかで読み出したときに、 「ソースの表示」をやってみると 「NULL文字を含むファイルです。半角スペースに変換してから表示します」 ってなって読みだした文字列の後に大量の半角スぺース(きっと元はNULL文字)が含まれているのが確認できるんですけど、 コレを無くすにはどうすればいいですかね。 AJAXで読み込んだときにNULL文字以下が表示されんくなってしまって困ってます。 誰か心当たりあったら解決策お願いします。
691 :
690 :2009/08/30(日) 14:56:51 ID:LriVeEv0
コレってむしろphp側の問題ですねorz スレ違いでした。 phpのスレで訊いてきます。
これが新手のマルチ投稿か
ランタイム情報の Slave_runningの値「ON」か「OFF」をmysqlで求めるには、 どのようなクエリを渡せばいいのでしょうか?
show status like 'Slave_running'; を、それぞれのプログラミング言語で select文と同じように実行すれば取れるよ。
695 :
693 :2009/08/31(月) 22:39:04 ID:???
>>694 あ、ありがとうございます。
とりあえずphpからクエリを投げてみることにします。
phpmyadminばっかり使ってるとダメですね・・。
相談です。 16桁の数字からなる商品番号を格納するカラムのデータ型は何がいいでしょうか? (1) BIGINT型で、16桁の整数として格納する (2) CHAR(16)型で、16個の文字からなる文字列として格納する (1)と(2)と、どちらが検索が速いでしょうか? データ件数は、10万〜100万件程度です。 アドバイスよろしくお願いします。
>>696 64bitならもちろん、32bitでも、bigint のほうが早いはずだぜ。
まぁ、やってみたら?
698 :
696 :2009/09/01(火) 21:00:44 ID:???
>>697 アドバイス、ありがとうございます。
16桁の商品番号の格納は、BIGINT型で行ってみます!(・∀・)
一応ベンチマークも測ってみようと思って、今100万個のテストデータを作成中ですが、
MySQL5のストアドプロシージャとかで、乱数を一気に100万個ぐらい作る方法ありますかね?
=とりあえずPHPスクリプトで、5000個ずつINSERTしてます><
Tritonn使ってるんだけど Where ColName Like '%検索ワード%' と Where match(ColName) against('検索ワード') って結果が違います これって正常なこと? 何か根本的に間違ってたりしますか?
700 :
699 :2009/09/02(水) 15:45:21 ID:???
すまん、 書き込んだ直前以降はちゃんと同じ値になってました。 なんか構文間違ってたんだと思います。