1 :
NAME IS NULL :
2009/11/23(月) 07:21:10 ID:X6i6+8qI
2 :
NAME IS NULL :2009/11/23(月) 07:22:46 ID:X6i6+8qI
3 :
NAME IS NULL :2009/11/23(月) 11:09:06 ID:+o/Ub6PC
乙カレンダー
6 :
NAME IS NULL :2009/11/23(月) 18:54:53 ID:KwUk/mR7
ところで SELECT * FROM table WHERE field1 IN ('apple','orange') OR field2 IN ('metal','wood'); みたいな複数カラム&複数キー検索をスマートにする方法はどんなのが考えられますか? よろしくお願いします。 尚、キーは実際はもっと数を増やしたいのですが。
7 :
NAME IS NULL :2009/11/24(火) 18:02:22 ID:8R6XCZ3d
質問させてください。 selectとinsertのみが行われるテーブルがあります。 テーブルは月毎に作成されて大体800万レコード位になります。 今までInnoDBでテーブルを作成していたのですが、 selectとinsertはMyISAMの方が早いかと思い変更を検討してます。 ただMyISAMではselectでもテーブルロックがかかるとの事だったので、 selectもinsertも頻繁に起こる環境の場合はInnoDBの方がいいんじゃないかと思ってます。 selectとinsertのみのテーブルでもinnoDBの方が良いという事はありえますか? よろしくお願いします。
MyISAMにはconcurrent insertという機能があって 一つのINSERTと複数のSELECTは同時に走ることができる でもInnoDBでうまく動いてるならそのままでいいんじゃないの
9 :
NAME IS NULL :2009/11/25(水) 19:32:30 ID:NAh8t8yE
どう考えてもわからないので質問します。 イベント情報の検索システムを作ってるんですが、 イベントの出演者名/イベント日/イベントジャンル の指定がある場合のクエリについてお願いします。 関係するテーブルは以下です イベントの基本情報)evKihonTB > id(主キー), evName, evDay, evGenre イベントの出演者情報)evPlayerTB > id(主キー), evId, pName ※evPlayerTB.evId=evKihonTB.idの関係です 出演者名の指定がなければ、evPlayerTB.evId = evKihonTB.id を条件にLEFT JOINすればいいですが、 出演者名{$pName}があると手順がわからなくなりました とりあえず 1)SELECT evPlayerTB.evId FROM evPlayerTB WHERE evPlayerTB.pName LIKE '%{$pName}%' を実行して、該当する名前の人の所属するイベントIDを取得 2)結果データ$rsの中を対象にforeachしてその中でイベントID(evId)を取得しつつ $sql = SELECT evKihonTB.* FROM evKihonTB WHERE evKihonTB=$value['evId'] クエリ実行 とすればいいのかと思ったのですが。ここで疑問です 1)の時に、条件({$pName})の名前が複数登録されてた場合(山田太郎と山田次郎がいるなど) 取得されるevIdも同じものが複数になります。 このとき、スクリプト側で余分を除外するのでなくSQLで一イベント一件の指定が出来ますか? ※全体にLIMIT 1することは出来ません。山田太郎が複数イベントに参加してる可能性もあるので。。 また、そもそも上の1)2)とはちがうスマートな方法あるでしょうか? 長くてすみません、ご意見よろしくお願いします。
10 :
9 :2009/11/25(水) 19:44:58 ID:NAh8t8yE
あーー!大失敗、すみません書き直します。上の1)2)のクエリ部分無視してください。 イベントの基本情報と、出演者全てを取得するのが目的なので、 僕の考えでは、 1)入力された名前を条件に基本情報も取得します SELECT evKihonTB.* FROM evKihonTB.id LEFT JOIN evPlayerTB ON evKihonTB.id = evPlayerTB.evId WHERE evPlayerTB.pName LIKE '%{$pName}%' AND …以下、日付条件など 2)この結果をforeachして、evPlayerTBから、指定された名前の人以外の出演者たちを取得します $sql = SELECT evPlayerTB.* FROM evPlayerTB WHERE evPlayerTB.evId=$value['evId'] これをクエリ。 このあとの疑問と悩みは上記と同じです。 1)の段階で、同じ名字の人が何人いようと一イベント一件の指定法など、なにとぞ宜しくお願いします。 長レスでよごしてしまい、お騒がせしてすみませんでした。 また、プログラムはPHPを考えています。
どういう結果が欲しいのかさっぱりわからんw 唐突に名字なんて出てくるのはなんで?データ上に表現されてないよね?
12 :
9 :2009/11/25(水) 21:37:24 ID:NAh8t8yE
>>11 説明不足ですみません
>1)の時に、条件({$pName})の名前が複数登録されてた場合(山田太郎と山田次郎がいるなど)
ここのことです。
名字でなくてもいいんですが、「出演者名」で指定された文字が複数の出演者名の名前中にあった場合、です。
宜しくお願いします
13 :
NAME IS NULL :2009/11/25(水) 22:21:43 ID:iF08TxUS
debian初心者ですが、質問です 今まで他のOSでMySQLを使っていたのですが、事情があって Debianで、そのDBを運用する事になりました。 でもterminalの画面でも、PHPをつかったWebAppでも 文字化けして????? しか表示してくれません。 一応my.cnfもphp.iniもdefault_charsetにはUTF-8としています 何が原因なのでしょうか? もしご存知でしたらお教え願います。 よろしくお願いいたします。
>>13 そういえば、俺も InnoDB の時だけ同じように「???」になっちゃうんだよね。
phpなどのAPIから呼べば正しく取得できるけど、
MySQLのコンソールでだけ化ける。
原因は分からない。役立たずでごめん。
>>13 mysql> set names utf8;
やってみた?
あと、ターミナルの日本語環境も・・
随分前なので記憶が曖昧なんですが、 MySQLを一度インストールして調子が悪かった為アンインストールしました。 その後に再度インストールしようとすると途中でinternal error 2503と2502が出て、 失敗してしまいます。 レジストリを弄ったりしましたが詳しくないので正直解決方法が解りません。 services.mscにMySQLの項目も表示された状態になっています。 環境はWindows Vista Ultimate Service Pack 2です。 解決策など有りましたら教えて頂けると嬉しいです。
>>18 すみません。
回答有難う御座います。
詳しくないのにレジストリ内のMySQLって単語を検索して、
引っかかった物を削除していたら
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer
CurrentVersion下にInstallerの項目が無くなっていました。
連投すみません。 自分の見間違えだった様で HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer 項目は存在しました。 お騒がせして申し訳ありません。 これってインストール出来る状態に戻せるのでしょうか? 最悪OSの再インストールも考えています。
>>20 もう、本家から"withiout-insatll"パッケージ落としてきて、手動で入れちゃえば?
ウチではもう随分前から、バージョン上がるごとにUpしたり、複数バージョン同時に
試したりするのに、いちいち入れ替えるのメンドクセーから、インストーラー使ってないなあ。
>>20 覚悟ができてるのなら、
2chで聞くのは無駄。
さっさと再インストールするべき。
23 :
NAME IS NULL :2009/11/29(日) 23:50:21 ID:JvyHdHfV
質問します。 SELECT * FROM TABLE1 ORDER BY RAND(); ってやると、ランダムな順番でデータを取得しますが、 ランダムだけど、特定のidを一番上に(最初に)取得したいんです どうしたら良いんでしょうか? TABLE1の構造は id, name だけのシンプルなものとします。 たとえば、1から100まで行があって、id30を最初に抽出して残りの99こは ならび順ランダムで取得したいんですが… よろしくお願いします
id = 30でSELECTした後 id <> 30 ORDER BY RAND();とくっつけりゃいいんじゃないの?
25 :
NAME IS NULL :2009/11/30(月) 20:03:30 ID:bD0H6ETy
MySQLをWinXP64bitで動かすのは邪道ですか?マージ処理が早そうなんで。
てすと
>>23 ORDER BY
id="id30" DESC,
RAND()
29 :
NAME IS NULL :2009/12/02(水) 00:19:52 ID:DFvwjp69
文字化けの問題皆さんどうされているのでしょうか? コマンドプロンプトでShift_JISで入力したものをPHPでブラウザに出力すると文字化けします PHPコードはEUCで保存しているのですが、Shift_JISで保存するとデータベースからの出力分だけでなく、当たり前ですがPHP側の日本語も文字化けします ではコマンドプロンプトにEUCで打ち込もうとするとコマンドプロンプトにエラーと怒られます 皆様はどの文字コードでMySQL側にデータを入力し、どのテキストエディタを使って文字コードでPHP等の保存をされているのでしょうか? 自分はmy.iniの設定は[mysql]と[mysqld]に、default-character-set=sjis を指定しております
30 :
23 :2009/12/02(水) 11:30:16 ID:???
23です、答えてくれた皆さんありがとうございました 助かりました、本当にありがとう
へー PHPにはmb_convert_encodingのようなエンコード変換関数って無いんだ?
SET NAMES
お詳しい方、CONCATの使い方を教えてください。 イメージとしては、 -------------------------- SELECT * FROM my_table -------------------------- これを↓ -------------------------- SELECT * FROM CONCAT('my_', 'table') -------------------------- こういうクエリで実現したいのですが、エラーが出てしまいます。 #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '('my_', 'table') at line 2 MySQLの文字列関数とかを組み合わせて使うのが初めてなので、 そもそも考え方とかが間違っているのでしょうか・・・。
34 :
NAME IS NULL :2009/12/07(月) 14:04:17 ID:VuPU4EWA
varcharの長さと、文字セットについて教えてください。 テスト用にwindowsに入れたmysqlでテーブルを作ろうと思ったら varchar(65535)のカラムにで ERROR 1074 (42000): Column length too big for column 'comment' (max = 21845); use BLOB or TEXT instead というエラーが出ました。これはvarchar(n)のnは文字数で、サーバーの文字コードがutf8になってるから、最大で3バイト消費するutf8を考慮して 65535/3なのかなあ、と想像したのですがこの辺まで問題ないでしょうか? で、本番用の環境は今のところMysqlサーバーの文字コードがデフォルトのまま(latain1?)になっていて、接続した時クライアントでset names utf8を実行して 使っています。CREATE DATABASEする時はDEFAULT CHARSET UTF8を指定しています。この環境で同じテーブルをクリエイトすると 65535のまま通ってしまいます。 この状態で使い続けたとして、例えば一文字3バイト消費する文字を21845文字以上いれようとするとどうなるのでしょうか? バイト換算して65535文字以上はカットされるのでしょうか?その際、おかしな場所できられて、最後の文字が文字化けとかしないのでしょうか? 問題ないのであれば、逆にvarchar(21845)と指定しまうと1バイト文字ばかり入れた時、無駄というか、もったいない気がするのですが・・・ UTF8でデータをしまいたい時は、どのような設定にしてますか?
>>34 varchar なので、1バイト文字1文字のために3バイト確保するような、
無駄な領域を確保することはないはず。
…と思ったら、内部は UCS2 で保存されてるんだったっけ?
>>33 抽出対象のテーブル名を可変にしたいって事?
>>34 そもそもvarcharのサイズには制限が
あったはず。255だか。
だから、わざわざ警告が代替型を
言ってくれてる。
>use BLOB or TEXT instead
>>37 無理。
関数は使えるところがきまってる。
>>34 >latain1カラムにutf8テキスト
試したか?
できないと思うんだけど。
>>40 そうだったのですか
ありがとうございます!
45 :
45 :2009/12/08(火) 15:51:28 ID:???
VistaのUAC切ったらうまくいった ...根本的な解決になってないけどとりあえず報告
46 :
NAME IS NULL :2009/12/08(火) 19:30:53 ID:rUX8tQvJ
相談させてください Web掲示板を作りたいと思っています。 そこでtableの構造について悩んでいるのでアドバイスを頂けると助かります 1. threadとresというテーブルを作り、threadにはスレ名とレス総数、thread_idとresにはレス情報が収まる 2. threadとresというテーブルを作り、threadにはスレ名のみ、resにはthread_idとres情報が収まる(スレ毎のレス数はCOUNT()で計算する) 仮に、掲示板が大勢の人達によってアクセスされ書き込みされるような場合 上記二つの構造だとどちらがいいのでしょうか? よくみるfreeのcgi掲示板とかでは 1 のやり方が殆どでした(DBは使わずファイルに書き込み保存する形式) また、その他にいい構造や手段がありましたらご教授お願いしますm(__)m
47 :
NAME IS NULL :2009/12/08(火) 19:33:57 ID:rUX8tQvJ
>>46 訂正
1. threadとresというテーブルを作り、threadにはスレ名とレス総数、resにはthread_idとレス情報が収まる
ある端末でWindows Server 2003 R2でMySQL5.0.27使ってるんですが、 2時間程度ある処理(Javaのバッチ処理でConnector/J5.0.3を使用してMySQLと接続)を ぶん回すと、レスポンスが全体的に悪化します。 識者に確認したところphpMyAdminのランタイム情報で 「中断しました。」が800程度出ているせいだと断言されたのですが、 開発端末で検証したところ、中断コネクションが多発しても性能劣化は発生しませんでした。 そもそも「中断しました。」が多発することで性能劣化はおきえるものでしょうか? コネクションの切り貼りが多くなる実装が悪いことは重々承知です。
>>46 2番で充分じゃね?
間に合わなくなったらサーバー増やせば良いし
固定長構想にすると、本当にレコードの検索が速くなるんでしょうか?
>>50 ウチでちょっと前にやってみた時は、
レコード500万、テーブルサイズ約300MB(可変長時)、約800MB(固定長時)のテーブルで、
正味、プライマリーキー(int型)に対する検索だけでははほぼ五分。
でも、一緒に引いてくるカラムがvarcharの時とcharの時で、後者が方が約10%程度早かった。
ちなみにインサート時は、Load Data Infile ではこれまたほぼ五分だけど、
一行ごとのインサートや、後からAlter table等でIndexの追加、変更なんかをした時は、
固定長の方が5%前後早かった。
まああくまで自前の環境と自前のデータでちょっとやってみただけなので、他環境のことは知らない。
自分的には、ファイルサイズ三倍弱で、この程度のパフォーマンスUpだと割りに合わないと感じたので、
可変長に戻した。あとは自分でやってみて判断してくれ、としか言えない。
amebaの開発者が書いたmysqlの本だかに、 結局IO周りでボトルネックになるからvarcharのほうがいいよって書かれてた気が。
>>51 乙。
参考として聞きたいんだけど、
そのcharカラムのサイズは?
>>52 可変長カラムは間接アクセスが必要
なので、一般的に、固定長カラムよりも
速度的には不利だと、公式ドキュメントに
書いてあったはず。
54 :
51 :2009/12/10(木) 21:29:53 ID:???
>>53 テーブル構成はこんな感じ
(c1 int(10) unsigned,
c2 varchar(32),
c3 varchar(128),
primary key(c1) )CHARSET=ASCII
なんのデータなのかは想像におまかせします・・(w)。
>>52 そう、そのことも念頭にあったので、datadirをRamdisk上に配置して、
さらにmysqld起動直後に、インデックスとテーブル両方メモリキャッシュに
読見込んだ上でやってみた結果が
>>51 。
いろいろやってみて面白かったのは、select * from と select c1,c2,c3 で取った時は、
可変、固定ともに差が出ないのに、select c2,c3 とか、select c1,c3 とか、select c3 とか
の時は、固定長の方が明らかに優位があった(最大で10%程度)(まあ予想通りっちゅやそうだが)。
あと、c2をインデックス化して、where c2 = ** の時も、固定長の方が早かった(これはようわからん)。
上のパターンでは、ファイルサイズで大体予想つくと思うが、可変時で1レコード当たり約60byte程度、
固定長ではレコードあたり約160byteなので、容量が実用量の2.5倍以上になる。
予想としては、varcharカラムが多くて、且つ avg(length()) の割合が高ければ高いほど、
固定長にする値打ちが上がって来るように思う。
逆に、実容量がカラム定義より少なく、且つメモリに乗らないくらい大きくなればなるほど、
可変長の方が有利になるんでないかな。
varchar(300)で済むカラムをvarchar(65534)にすると、なにかデメリットってありますか? 実質、使用容量もシーク時間も変わらないのでは? と思ってしまうのですが バージョンは5系です。
56 :
53 :2009/12/11(金) 09:01:35 ID:???
>>54 肝心なことを聞き忘れた。orz
ストレージエンジンはMyISAMだよね?
57 :
54 :2009/12/11(金) 16:38:42 ID:???
>>56 もちろん。ってか、MyISAM以外で、Row_format=fixedには出来ないんじゃないの。
Innodbはテーブルの格納の仕方がかなり違うみたいだし。
58 :
53 :2009/12/11(金) 19:02:21 ID:???
>>57 了解です。どーも。
>Innodbはテーブルの格納の仕方がかなり違うみたいだし。
InnoDBはけっこう冗長だそうなんで
完全に別として、MEMORYだったりは
するかも、とちょっとおもてた。
59 :
48 :2009/12/12(土) 10:09:15 ID:???
どうやら、OSのリソースリークをMySQLが誘発してるっぽいんですが、 過去事例とかご存知の方いらっしゃいませんか。
マルチポストっぽいが、誘導されてここに来ました。 ネットワークエンジニアなんだが、昨日、会社からデータベーススペシャリストの 資格取れと言われた。 MySQLからはじめようと思うのだが、MySQLの良い基本書はないかな? できればコマンドラインからの入力から説明している基本書がいい。 Webの説明は見にくいのが辛い…。
>>61 資格を取るのが目的なら、その資格の参考書買って勉強するのが一番てっとり早い
>60 thx。一通り目を通したけど、怪しいような違うようなというのが多いですわ。 リーク系バグの影響を受けてるんだとは思うけど、 それなら開発環境で再現するだろって内容が再現しないから厳しい・・・
俺が手元に置いてんのは MySQLコマンドブック インストールから関数の解説までは一通り載っている。 入力についてもmysqlコマンドラインでの説明もある。 けどMySQLで資格と言っても…w
>>62 >>64 レスサンクス。
一応、DBスペシャリストの参考書は持っている。
しかし、正規化とかあんまよくわかっていない。
SQLも理論ではわかりづらいので、フリーのDBで勉強しようと思ったまで。
マジレスするが、MySQLで受かるとは毛頭思っていない。
ただ、フリーのDBがPostgreSQLとMySQLくらいしか思いつかんかった。
まぁ、こんな調子だからDBスペシャリストの勉強もベトナム戦争のように
泥沼化して、不合格になるのがオチだろうなw
>>65 他にも
SQLServer ExpressEditionとかOracle10gXEがあるよ
>>65 MySQL GUI Toolsが超オススメ。
>>68 かわらんと思う
VARCHARは実データが何バイト入るかだけが問題
INNER JOINってややこしくないですか?
myisamで起こるロックについて質問させてください。
現在ちょっと重たいSELECTを発行しています。
すると他のselect文もロックされてしまいます。
> 5924480 wp 192.168.xxx.xxx:63080 wordpress Killed 9533 Sending data SELECT count(*) FROM wp_posts INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
> INNER JOIN wp_term_taxonomy ON (wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id) WHERE 1=1 AND wp_term_taxonomy.taxonomy = 'category' AND wp_term_taxonomy.term_id IN ('22407',........)
> 5924495 wp 192.168.xxx.xxx:63105 wordpress Query 9532 Locked SELECT count(*) FROM wp_posts INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
> INNER JOIN wp_term_taxonomy ON (wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id) WHERE 1=1 AND wp_term_taxonomy.taxonomy = 'category' AND wp_term_taxonomy.term_id IN ('91717')
http://blogs.sun.com/takemura/entry/myisam%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3%E3%81%AE%E3%82%B3%E3%83%B3%E3%82%AB%E3%83%AC%E3%83%B3%E3%83 %88%E3%82%A4%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%88%E6%A9%9F%E8%83%BD%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6
> MyISAMは皆さんご存知のように、テーブルレベルのロックのみで行レベルでのロックがサポートされていません。MySQLではSELECTコマンドの実行時に暗黙的リードロック(Shared Read lock)がかかるようになっており、
一般的にはこのロックが対象のテーブルに存在している場合には、書き込み処理(INSERT,UPDATE,DELETE,ALTER TABLEなど)がロック待ちとなります。SELECTの実行が完了してからINSERTなどが実行される形になります。
この辺があやしいのかとも思うのですが、
> 書き込み処理(INSERT,UPDATE,DELETE,ALTER TABLEなど)がロック待ちとなります。SELECTの実行が完了してからINSERTなどが実行される形になります。
とあるので、selectがロックする->updateがロックされる->selectがロックされる
となるのかな、と思ってるのですが原因と断定できず困っています。
この辺のことを詳しく書いてあるようなサイト・書籍・キーワードなどを探しています。教えてもらえませんか?
>>65 ぶっちゃげRDBMSはPostgreSQL、教科書は増永先生などの基礎論のを
一冊買って勉強した方が良い。
標準SQLの対応としてはPostgreSQLの方が一日の長があるし、正規化
も数学的に大変クリアな概念なので一度ちゃんとした教科書できちんと
した理屈付けや定義は見ておいた方が良い。
遠回りに見えるかもしれないけど標準SQLも関係代数もつぶしがきく
知識なので絶対に無駄にはならないと思うよ。
質問させてください。板違いなら誘導おねがいします。 質問◆MySQLをインストールする前の状態にするにはどうしたらいいのでしょうか。 経緯◆データベースの勉強のためLAN内のサーバ(CentOS5.4)に、PC上のsshクライアントから yumでインストールしました。 # rpm -qa mysql mysql-5.0.77-3.el5 # rpm -qa mysql-server mysql-server-5.0.77-3.el5 # rpm -qa perl-DBD-MySQL perl-DBD-MySQL-3.0007-2.el5 # rpm -qa php-mysql php-mysql-5.1.6-23.2.el5_3 ところが初回起動時、自分が意図しないパスワードを設定したらしく(※)下記のエラーで立ちあがりません。 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) そこで、権限無視モードで立ち上げる方法を検索して起動しました。 # /etc/init.d/mysqld start --skip-grant-tables MySQL を起動中: [ OK ] しかし # mysql -u root ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) となってしまいました。 クライアントが無事起動したら UPDATE mysql.user SET password=PASSWORD('password') WHERE user='root'; とするつもりでした。 (ちなみに「# mysqladmin -u root」は大量の情報を吐いたあとrootプロンプトにもどってしまいました。 また 「$ mysql」 一般ユーザでは立ち上がります) # yum remove mysql Erasing : mysql 1/4 Erasing : php-mysql 2/4 Erasing : perl-DBD-MySQL 3/4 Erasing : mysql-server 4/4 Complete! と削除したあと、またインストールしてみましたが同じ結果でした。サーバのコンソールからもやりましたが同様でした。 どうやらパスワードリセットの方法は使えないようなので、MySQLをインストールする前の状態にしたいのです。 (※)自分が意図しないパスワードを設定したというのは、sshクライアントの画面の内容を保存しておこうと、大量の文字をコピーした んですが、それをsshに貼ってしまったのです!なかなかプロンプトが帰ってこず、Ctrl+Cをしたら画面には Clean up... と出ていました…。 なにかをClean up中にCtrl+Cしてしまったわけです。 よき解決策をご教示いただければ大変にたすかります。 よろしくおねがいいたします。
>>76 rm -rf /var/lib/mysql/*
/usr/bin/mysql_install_db
以上。
mysql_install_dbは、mysql-serverパッケージに含まれてる。
MySQL 5.5 がでましたね。 もちろんおまえらはもう version up したよな?
そんなホイホイあげられるかよ
WinXP + MySQL5.1.41 optimize について教えてください。mysqlで以下のメッセージが出ました。対象テーブルはInnoDBです。 mysql> optimize table ***; +----------+----------+----------+-------------------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | +----------+----------+----------+-------------------------------------------------------------------+ | test.*** | optimize | note | Table does not support optimize, doing recreate + analyze instead | | test.*** | optimize | status | OK | +----------+----------+----------+-------------------------------------------------------------------+ 2 rows in set Optimizeではなく テーブルを再作成してAnalizeを代わりに使えって言ってるみたいですけど、 InnoDBはOptimizeをサポートしていないんですか?
InnoDBは、OPTIMIZEをすると ALTER TABLE ... ENGINE = InnoDB が代わりに実行されるようになっている。 テーブルの再編成をしたかったのなら、これでOK
82 :
80 :2009/12/16(水) 21:28:22 ID:???
問題は無い…という風に理解してよろしいのでしょうか?
83 :
76 :2009/12/16(水) 21:57:40 ID:???
>>77 出来ました!感謝です。
色々と試してみたいと思います。
ありがとうございました。
NULL と 0 が同義に扱われてると知らなかったのですが、 値が正確に NULL か 0 かを評価することってできないのでしょうか? やりたいことは、 +----------+ | num | data | +----------+ | 0 | A | | 1 | B | | NULL | C | +----------+ ここでフィールド num の値が 0 以外のものをすべて SELECT で抽出したいのです。 (表の場合だと B と C のレコードだけ取りだしたい) 以下では 0 が NULL と扱われているようで、うまくいきませんでした。 SELECT * FROM tbl_name WHERE num != 0 × SELECT * FROM tbl_name WHERE num + 1 != 1 × 詳しい方教えていただけないでしょうか。
>表の場合だと B と C のレコードだけ取りだしたい SELECT * FROM tbl_name WHERE num != 0 OR num IS NULL
89 :
NAME IS NULL :2009/12/18(金) 14:14:19 ID:mi4KaXUR
MySQLというか設計の話になると思うんですけど 1対1のリレーションを作るとき、例えば shopとshop_addressを別のテーブルに分けて作るとき、shopがaddressを持ってると考える方が 自然っぽいので CREATE TABLE shop ( id int unsigned NOT NULL AUTO_INCREMENT, shop_address_id int unsigned NOT NULL, name int unsigned, PRIMARY KEY (id) ); CREATE TABLE shop_address ( id int unsigned NOT NULL AUTO_INCREMENT, address int unsigned, PRIMARY KEY (id) ); ALTER TABLE shop ADD FOREIGN KEY shop_address_id REFERENCES shop_address (id) ON UPDATE CASCADE ON DELETE CASCADE ; こんな感じにテーブル作ると思うのですが、これを逆に CREATE TABLE shop_address ( shop_id int unsigned NOT NULL AUTO_INCREMENT, address int unsigned, PRIMARY KEY (id) ); みないに外部キー自体をそのテーブルの主キーにするのは変でしょうか? MySQLって外部キーにも自動でインデックスを貼るみたいだし、登録・アップデイト時のコストを考えると コッチのほうがいいような気がするんですが、おかしいでしょうか? お願いします。
90 :
NAME IS NULL :2009/12/18(金) 14:27:04 ID:IKJKYiUP
Alter table構文を使って、既存のテーブルにon update cascade等を追加する方法はありますか?
>>90 一回外部キー制約自体を削除して新たに制約をALTERするのじゃだめですか?
>>91 それで大丈夫でした。ありがとうございました。こうやってやるんですね。
C:ドライブにインストールした後で、 新たに作るデータベースを、D:とか他のドライブに作れますか?
94 :
NAME IS NULL :2009/12/19(土) 18:00:34 ID:j3ghDKdv
Linux、DBともに初心者です。 MySQL5.0、text型のフィールドにShift_JISの文字列を入れる処理を行いました。 【クエリ例】 REPLACE foo_table SET bar = 'サシスセソ\' WHERE 〜; 【結果】 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 〜 クエリでは、Shift_JISにおける「ソ」の2バイト目がバックスラッシュになる関係で、「ソ\」としていますが、 これがどうやら、直後の「'」と結びついてしまい、結果として文字列のシングルクォーテーションが閉じてない ……と判断されてしまうのではないかと思いました。 「ソ」の後に「\」を付けない場合、ターミナルからではそもそもコマンドとして受け取ってもらえません。 「ソ\ 」のように、後ろに別の文字(半角空白など)を挿入した場合は何ら問題なく実行されます。 十中八九、どこかの設定がマズいのだと思いますが、何かヒントを頂けませんでしょうか。 アプリケーションを変える、文字コードをShift_JIS以外にする、というのは運用上難しいです。
>>94 俺は ExcelVBA MySQL5.1.37
str1 = Replace(str, "\", "\\", , , vbTextCompare)
という風にしてtext型のカラムに入れてる
ちなみに、testで
aa int
tt text
で
insert into t(aa,tt) values(1,"サシスセソ\\");
これでセット出来たよ
ソ\\\
>>94 状況不明。
手順をもっと具体的に。
推測できる問題は、ターミナル、MySQL
クライアントの文字エンコーディングの
設定か?
ちなみに、ちゃんとした環境だったら、
\とかいちいち気にしなくてもいいはず。
>>95 VBAって\によるエスケープってありましたっけ?
>>96 ダメでした
>>97 先に挙げたクエリを叩いたら文法エラーって言われたので何でだろ?ってだけで。
正直、それ以上の手順はありません。
>ちゃんとした環境
そうなんですよね。
前にMySQLを使ってた時(バージョンは不明)は、そんな問題を気にしたことが無かったんで。偶然かもしれませんが。
4つのテーブルをINNER JOIN させたいです。 例を下さい
100 :
94 :2009/12/20(日) 00:54:36 ID:???
今気づいた。 >94のクエリ例にWhere句がくっついてるのは気にしないでください。 必要な部分だけ切り貼りしたり、書き換えてる時にミスったようです。
どういう環境で入れたのか
>>98 >クエリを叩いた
その手順を言えっつーんだよ。
ターミナル、MySQLクライアント、あるいは
他の何か、の切り分けができねーだろ。
ところで、Windows環境で
SELECT "ソ"
を実行してもそうなるみたいだな。
ターミナルの文字エンコーディングが
ShiftJISだとダメなんでは。
utf8にでもすれば。
103 :
94 :2009/12/21(月) 11:34:24 ID:???
解決はしてませんが、原因の切り分けが出来ました。 アプリケーションからMySQLにクエリを渡すとき(サニタイズ時)に原因があったようです。 お騒がせしました。 アプリケーション(Perl)からMySQLを叩いてエラーを出したとき、 その時のクエリを標準エラーに渡すような作りになっていたのですが、 それをターミナル上でコピペしてたので、当然エラーになっていました。
SELECT * FROM table WHERE (col1,col2) IN ('val1','val2') ってMySQLではできないのでしょうか? 5.1を使ってますがエラーがでます。
>>89 いいんでないの?
そうやってる場合も多いと思う。
プライマリーキーは数値じゃなくてもいいんですか?
>>107 どこに括弧を入れればいいんでしょうか?
SELECT * FROM table WHERE (col1,col2) IN (('val1','val2'),('val1','val2')) ああ、こういうことですか。 複数カラムに同じキー配列を検索かけることはできないんですかね?
>>111 質問者が聞いているのは微妙にそこじゃない気がする
updateするときのvaluesみたいな感じで、そのまま並べられないの? という質問とみた。
たぶんこれを冗長じゃなく書きたいんじゃないかと。 col1 in ( 'val1', 'val2' ) or col2 in ( 'val1', 'val2' )
104=109=110=115 です
すいません間違えました 104=109=110=112=114=116=117 です
ひとり漫才かよ 112と114は違うでしょ。
すいませんすいません 104=109=110=112=114=116=117=118=119 です
お前は俺だったのか!
122 :
NAME IS NULL :2009/12/23(水) 21:08:36 ID:dybUrgQR
MySQL5.1 で、複雑な処理をするストアドを書こうとしてます。 結果をレコードセットとして受け取りたいんですが、、どうにもやり方がワカランです。 create procedure sample ( OUT param ??? , IN param2 INT) BEGIN SELECT ...... ...... END と書くのはいいけれど、paramに結果セットを入れて…呼び出し側からはレコードセットを…と思ってます。 (実際はPHPで呼び出したいんですが) やり方として間違っているのか、MySQLでは出来ないのか… ググってサンプルを参考にはしてるのですが、複数結果を返すようなものが見あたらず… よろしくお願いします。
123 :
NAME IS NULL :2009/12/24(木) 02:06:04 ID:JPg1Hzat
MySQLって再配布自由なんだっけ? 自分のアプリにバンドルして問題ない?
>>123 >再配布自由
なわけがない。
あたりまえ。
詳しくはライセンスを読め。
あたりまえはともかく ライセンス違反を指摘された時に2chで聞いたからと答えるつもりなのかと
別にええんちゃう
どっちにしても責任は本人がとるしか ないんだしな。
自分のアプリがGPLなら良いんちゃう?
>>122 1ヶ月ぐらい前に同じことで悩んだ。
たぶんできない
InnoDBについてですけど、、、、 ibdata1って大きいファイルがありますけど、 例えばAと言うデータベースはこのファイルに、Bというデータベースはあのファイルにって使い分けはというか指定は出来ないのですか?
innodb_file_per_table = 1 を設定して データベースを作り直せばできる。
MyISAMみたいにそのファイルコピーしても バックアップ・リストアはできないから注意してね
135 :
131 :2009/12/26(土) 18:29:04 ID:???
>>134 すいません、ついでに教えてください。
今はバックアップは mysqldump で取っていますが、innodbの場合、他にバックアップの手段は有るのでしょうか?
はじめまして 主キーと外部キーとユニークキーは理解できるのですが、 ただの KEY というのはなんでしょうか?
137 :
131 :2009/12/26(土) 19:54:04 ID:???
ググってみると InnoDB Hot Backupというのがあるけど、これって商用みたいですね。 失礼しました
>>138 ありがとうございます
お礼が遅くなりすいません
>>134 あとほかにどのファイルが必要なんだっけ?
InnoDBの物理バックアップ(ファイルコピーによるバックアップ)は そもそもテーブルやDB単位では取れない。 基本的にdatadir以下を全部コピー。 質問の直接の回答としては、足りないのは以下の3ファイル。 datadir/ibdata1 (innodb_file_per_tableしてもなお必要) datadir/ib_logfile0 datadir/ib_logfile1
もちろんファイルコピー時にはmysqldを停止すること。 停止したくなければHotBackupを買うこと。
>>141 ありがとう
ib_logfile*もいるのかーこれかー
>>142 >HotBackup
のメリットってなんなんだろう?
dumpすればいいと思うんだけど。
TESTTIMEがDATETIME型で、2009-12-30 20:32:00のとき、 UPDATE test SET TESTTIME = TESTTIME + 10; とすると, 2009/12/30 20:32:10となって、次に+100とすると2009/12/30 20:33:10 となります。 本当は、TESTTIME + 秒 としたとき、秒分の加算された結果が欲しかったのですがうまくいきませんでした。 一応考えたのが、DATETIME型はやめて、INT型でmysqlの外からtimestampの値を入れようと思ったのですが これだと2038年頃で扱える数値の限界がきてしまうみたいなので避けようと思いました。 何か良い方法はありませんでしょうか。 やりたいことを詳しく書くと ・アクセスした時間を記録する ・同時に記録を削除したいタイマーをセットする ・時間は秒単位で検索したい ・記録した時間がタイマーより下回ったらアクセス記録を削除する といったようなことがしたいです。よろしくお願いします。
すみません質問した矢先にBIGINTなるものがあることを知りました 自己解決しました
>>144 物理コピーなのでバックアップ・リストアが速い
mysqldumpもバックアップは速いけどリストアが死ぬほど遅い
まぁインデックス作り直しになるわけだから遅いのは当然っちゃ当然だわな
149 :
NAME IS NULL :2010/01/02(土) 17:54:37 ID:+FDt10vX
mysql.hって何処で手にはいるの?
>>149 mysql-noinstall-5.1.42-win32(winなら
最近 MySQl (5.1.41) が
100104 10:48:15 InnoDB: Error: page 1 log sequence number 19962114575
InnoDB: is in the future! Current system log sequence number 3012747198.
InnoDB: Your database may be corrupt or you may have copied the InnoDB
InnoDB: tablespace but not the InnoDB log files. See
InnoDB:
http://dev.mysql.com/doc/refman/5.1/en/forcing-recovery.html のようなエラーをログに吐き、しばらくすると止まってしまいます。
メッセージのリンクを読んで、
innodb_force_recovery = 4
で起動して、全dumpとリストアをかけたのですが、それでも直りません。
解決策をご存じの方いらっしゃいませんか?
>>145 time_add( testtime, interval 100 seconds)
だったかな。
追加の時、数字を指定しなくても 自動で一番後ろに追加することってできないの?
>>151 dumpして、
データベースをdropして
mysqldを停止して
ibdata1とib_logfile*を削除して
innodb_force_recoveryを外して
mysqldを起動して
リストア。
俺はBigtableもしくは他のKVSと心中することにした
>>154 ありがとうございます。
レスを頂いた直後から作業を開始しましたが、リストアって時間かかりますね。
でも、ログエラーは(今のところ)出ていません。
このままうまくいくことを願いつつ、お礼申し上げます。
追加と更新って、どう違うんだ?
INSERTとUPDATEくらい違う
それを聞いてるんじゃん
MySQL5.0.45でストアドを書いてるんだけど、 エラーが起こったときに「HANDLER FOR SQLEXCEPTION」でエラーが起こったことはわかるけど、 どんな内容のエラーが起こったのか取得できなくて困ってます。 エラーの内容を取得する方法って有りますか?
全角でテーブル名とかカラム名とか使っちゃいけない感じ? いちいちバッククォートだかアクサンだかで区切るのめんどい。 SQLITEはそこら辺融通が利いたんだけどなあ。
>>163 テーブル設計するときは大体全部の項目が全角じゃん。
postgreとかSQLITEとかSQLServerだとそのまま流し込むのが一般的じゃん。
ドキュメントの手間省けるし。何よりオレがそれに慣れきってる。
だから今更全部エスケープとか正直辛い。なんか回避方法があれば是非。
PG視点とSE視点の違いってこういうことなのかな、と思った
DELETE + EXISTS の組み合わせの SQL って使えないですよね? DELETE FROM T1 A WHERE EXISTS (SELECT * FROM T1 B WHERE A.C1 = B.C1) みたいなのってエラーになりますよね?
これだから非英語圏はあああああああああ
kaiin_id juusho dennwabangou
MSSQLや、Access使いは全角派が圧倒的だな。 多分プログラムを書かない人たちだからかな。 個人的にはマジでやめてほしい。 Oracle派は半角大文字だね。 MySQL、PostgreSQL、SQLite派は半角小文字だな。
>>170 英単語で適切なカラム名を決められないときは、
何を入れるべきなのか分かってないことがほとんどだと思う。
たいていあとで泣きを見る。
unicode の問題とかは、些細なこと。
>>170 そんなに毛嫌いするほどのものでもないだろ
クライアントの強い要望でそういう設計したことあるけど
あれはあれでおもしろくて便利だったぞ
UNIQUE属性を付けるとめちゃくちゃ行のサイズが膨れるんだけど、どして? CREATE TABLE ユーザ( ID SERIAL, ユーザID VARCHAR(30) NOT NULL UNIQUE, パスワード CHAR(32) NOT NULL, メールアドレス VARCHAR(255) NOT NULL UNIQUE, ユーザ種別 INTEGER NOT NULL DEFAULT 1 ); たったこれだけのテーブルなのに一行が2300バイトとかそれくらい行きやがる。 制約としてユニークがほしいだけなのに、なんかインデックス作成されてるし。 どうすりゃええのん。
ユニークかどうか調べるのにインデックスが必要なんだ これはMySQL以外でも同じ メールアドレスにUNIQUEつけるのはかなり厳しい
メールアドレスって、そもそもユニークなもんじゃないの?
よく考えたらメールアドレスは変更される可能性もあるから、 UNIQUEは外してメールアドレス管理テーブル作ったほうがいいと判明した。 (変更の際と登録の際にユニークチェックすればいい) ありがとう。ユニークはIDだけにしておくわ。
MySQL の勉強を始めました。 phpMyAdmin にはじめから登録されている データは バッククォートを使用しない記述で成功するのですが(SELECT * FROM pma_history) 自分で作成したデータは バッククォートを使用しないと失敗してしまいます。(SELECT * FROM `pma_history`) バッククォートを使用しないようにするにはどうしたらよいのでしょうか? 又、バッククォートを使いたい場合に ` をコピー&ペーストでやっているのですがキー入力で使う場合には どう入力すればよいのでしょうか? MySQLのバージョンは 5.1.37です。 初歩的で申し訳ありませんがご教授お願いします。
Shift + @
179 :
177 :2010/01/08(金) 19:30:56 ID:???
>>178 ありがとうございます。
これで記述が楽になります。
180 :
NAME IS NULL :2010/01/08(金) 20:09:58 ID:u4qBdSv5
mysqlは一つのクエリー文を実行するときに関係するテーブルはロックされますか。 具体的には、 update aaa set bbb = bbb+1 where ccc = 'ddd'; このクエリー文を二つのクライアントA,Bから同時に実行したときに、インクリメントが二度行われるかが知りたいのです。 Aのクエリー実行のためにbbbを読む、Bのクエリー実行のためにbbbを読む、Aがbbb+1を書き込む、A用にbbb+1を書き込む、B用にbbb+1を書き込む、というように実行されたらBで実行したほうしか反映されませんが、実際のところどうなのでしょうか。
SQL単位で処理はアトミックなので+2される。
182 :
180 :2010/01/08(金) 21:57:45 ID:???
謝謝
LAN内で別PCのmysqlにアクセスしようとしたら Access denied user 'root'@'mac-mini' と表示されてしまいます。 mysqlテーブルでは Host:% User;root も設定してあります。 なぜ接続できないのでしょうか、パスワードもあっています。
184 :
NAME IS NULL :2010/01/09(土) 23:48:20 ID:ZiGlb1UO
LEFT JOIN でのインデックス作成の内容がよく分からないので誰か教えてください テーブルが二つあって `A.id`, `A.b_id`, `A.text`, `B.id`, `B.value` というカラムで 5 つ全てにインデックスを作成していて (カラム名と同じインデックス名) LEFT JOIN で A テーブルに B テーブルを JOIN してます この状態で `B.value` に対して検索を行ったクエリを explain で確認すると B テーブルに対しての type フィールドは eq_ref、possible_keys フィールドは PRIMARY,value となっていてインデックスが使用されているのは判るのですが A テーブルの type フィールドは ALL で、possible_keys フィールドは b_id となっていまして (他の key, key_len, ref フィールドは NULL です) これで A テーブルのインデックスって使われているんでしょうか ALL でなく ref になって他のフィールドも NULL でなければ使われている気がするんですが… もしかしてこの場合は、B テーブルの検索を行って、id を取得してその id を使用して A テーブルを検索するという SELECT を 2 回使わないといけないのでしょうか 詳しい人よろしくお願いします
LEFT JOINしておいて右側のテーブルに条件を差し込むのは筋が悪い じっくり考えたら、B.valueの条件で検索する場合、 LEFT JOINじゃなくてINNER JOINで良かったりしない? そうすればAの条件がrefになる
186 :
184 :2010/01/10(日) 00:44:11 ID:???
>>185 迅速なレスありがとうございます
上では書いてないんですが INNER JOIN でなく LEFT JOIN を使ってるのは
A.b_id に NULL が入っているレコードがあるんですorz
サイトの関係上 NULL を代用する事が不可能なんで LEFT JOIN で結合するしか無理で…
INNER JOIN も無理だとやっぱり SELECT を 2 回やるしかないですかね…
NULL が入っててもレコードを取得出来るなら INNER JOIN を使いたいんですが
もう SELECT 2 回やるしかないですかね…?
簡単な質問ですいません create tableは出来て、create databaseはできないユーザーを作りたいんですが 可能ですか?
テーブルにDateTime型で定義された列が存在している場合に、 2つの特定レコードの登録日を比較し、 経過分数をSQLで算出するにはどうすれば良いでしょうか? ※MySQL5.0 具体的には次の通り時間が@Aとあった場合に、 @からAまでの間の経過時間として 5分 という値が欲しいです。 時間@ 2010-01-10 10:10:00 時間A 2010-01-10 10:15:00
188 ですが自己解決しました。
>>187 特定のデータベースにしかアクセス出来ないようにして、create権限を与えたら良いのでは?
>>186 うん、A.b_idにnullがあるのは分かるよ。
で、B.valueで検索をかけたときに、
A.b_idがnullであるようなレコードは
決して検索結果として現れないと思うんだけど。
なので、その検索処理に限っては、INNER JOINでいいんじゃないの?
MySQLのSQLで経過時間をtimediff関数を使用して算出しているのですが、 取得された結果のうち ・時間 ・分 ・秒 のみを取得するにはどうすれば良いでしょうか? SELECT -- 時間 -- 分 -- 秒 -- 時間:分:秒 の取得 TIMEDIFF( NOW(), REGIST_DATE_TEST ) FROM TEST_TABLE
mysql> select now(),hour(now()), minute(now()), second(now()); +---------------------+-------------+---------------+---------------+ | now() | hour(now()) | minute(now()) | second(now()) | +---------------------+-------------+---------------+---------------+ | 2010-01-10 23:51:32 | 23 | 51 | 32 | +---------------------+-------------+---------------+---------------+ 1 row in set (0.00 sec)
delete from Table where min(No) これだとTableのNoの最小値が削除できません。 ご教授お願いします
DELETE FROM テーブル WHERE カラム=(SELECT MIN(カラム) FROM テーブル) じゃ駄目か?
WinXP MySQL 5.1です。 前スレでinnodb_file_per_tableについて聞いた者ですがまた 一つ教えてください。 dataがAll UsersのApplication Dataに出来ているのですが、これを 例えばd:\data\database\〜に指定することは出来ませんか? my.iniには #*** INNODB Specific options *** innodb_data_home_dir="D:/Data/DataBase/" という指定はしているのですが。
datadirも指定したらいいんじゃないの
>>198 有難うございます
show variables;
で変更後のディレクトリも確認出来ました
WindowsでUTF-8にしてインスコするとサービス起動の時に1067エラーでて 仕方なく SJISでインスコしちゃったんだけど変えられる?!
201 :
失礼します :2010/01/12(火) 10:35:18 ID:xpDNgIEn
202 :
NAME IS NULL :2010/01/15(金) 17:40:10 ID:h+tgglSf
RHEL5.4 mysql 5.0.77 を稼働させています。 大量のデータ(6000万件以上)&ひっきりなしに更新がかかるテーブルにindexを張りたいんですが、 create index 中はlockがかかってしまうようです。 稼働を止めずにindexを春にはどうしたらいいでしょうか?よろしくお願いします。
レプリケーションのスレーブで作って 入れ替え、かな もちろん入れ替え作業時は止まるけど
質問させてください。 linux + mysqlでシェルスクリプトからSQLを実行し、結果をCSVに保存しようとしています。 CSVファイルの名前をシェルスクリプト実行時に与えるパラメータで決めたいので >mysql -uuser -p pass db_name <hoge.sql >$1.csv のように実行しようと考えたのですが、 この時にフィールドディスクリプタをカンマに変更する方法はありますか? フィールドディスクリプタのデフォルト設定を変更する方法があれば、それでも良いです。 以上、よろしくお願いします。
select into outfile fieldsでぐぐるんだ
206 :
NAME IS NULL :2010/01/16(土) 14:15:14 ID:8tjiaE5+
>>203 ありがとう。なるほどね。
耐障害性も上がるしレプリ導入するか。。
切り替えずにそのままでレプリカ側で検索などさせればいいんだね!
これなら止まらないね!
207 :
NAME IS NULL :2010/01/16(土) 19:58:55 ID:7PRS7GSZ
>>203 レプリケーションする場合って同じverじゃないと駄目なんでしょうか?
スレーブのバージョンはマスターと同じかそれ以上だったはず 5.0 → 5.1 はOK マスタが3.23とか4.0とかは知らない
209 :
204 :2010/01/16(土) 23:08:03 ID:???
>>205 ありがとう。
でもそれだとファイル名をSQLに書くことになるから、固定になっちゃうんだよね。
そんなことないよできるよ $ OUTFILE='/tmp/test.csv' $ mysql -u root -p -e "select * into outfile '$OUTFILE' fields terminated by ',' from emp" scott Enter password: $ head -3 /tmp/test.csv 7369,smith,clerk,7902,1980-12-17,800.00,\N,20 7499,allen,salesman,7698,1981-02-20,1600.00,300.00,30 7521,ward,salesman,7698,1981-02-22,1250.00,500.00,30
mysqlが突然起動しなくなった。 何度立ち上げようとしても terminating worker thread 1とだけ表示される。 ローカルホストのmyadminに行っても例のエラー2003で接続不可。 挙げ句にサービスを調べてもmysqlが存在しなくなっていた。 原因は何なんだorz
212 :
NAME IS NULL :2010/01/17(日) 08:37:43 ID:Gs+xzQqA
OPENPNEをたちあげるため、mysqlにデータベースを作成しようとおもったのですが、 [ CREATE DATABASE openpne3 DEFAULT CHARACTER SET=utf8;]でつくると、 error 1064(42000) となります。 どうにかできませんか? OSはwindowsXPでMYSQLのバージョンは5.5です
古いサーバからmysqldumpでダンプしたら コメントに ----------- ってのがあるんだけど 最近のmysqlサーバだと-- の後ろにスペースが必要だから コメント扱いされないよね mysqlコマンドで、-- の後ろにスペースが無くてもコメント扱い してくれるようなオプションなり設定なりってあったっけ?
214 :
204 :2010/01/18(月) 22:18:27 ID:???
>>210 遅くなった。
そうかシェルスクリプトにそのまま書いちゃえば良いのか。
ありがとん。やってみる。
215 :
NAME IS NULL :2010/01/18(月) 23:19:06 ID:mfleopeD
久しぶりに見たら、質問応答スレになっちゃってた。 5.5の評判を聞きたかったんだけど・・・。 だれか使ってる人いる?
>>215 いれてみた。
5.1とあんま変わらんね。
217 :
NAME IS NULL :2010/01/19(火) 00:19:15 ID:jEOiz32W
下のようなデータ構造のテーブルがあるのですが、欲しい情報を得るSQLが分かりません。 どなたかご教示頂けないでしょうか。宜しくお願いします。 【テーブル】 TABLE_NAME ---------- COLUMN_1 COLUMN_2 aaaaaaaa 11111111 aaaaaaaa 11111111 aaaaaaaa 11111111 bbbbbbbb 22222222 bbbbbbbb 22222222 bbbbbbbb 33333333 bbbbbbbb 33333333 bbbbbbbb 33333333 【欲しい情報のイメージ】 aaaaaaaaのCOLUMN_2は1種類 bbbbbbbbのCOLUMN_2は2種類 【試して駄目だったSQL】 SELECT COLUMN_1, COUNT(COLUMN_2) FROM TABLE_NAME GROUP BY COLUMN_1; このようにしても、 aaaaaaaaのCOLUMN_2は3個 bbbbbbbbのCOLUMN_2は5個 という情報しか取れません。欲しいのは、あるCOLUMN_1に属するCOLUMN_2の「個数」ではなく「種類」です。 【環境】 MYSQL 5.0 Windows XP SP3
>>217 SELECT COLUMN_1, COUNT(*) FROM TABLE_NAME GROUP BY COLUMN_1, COLUMN2;
じゃダメだっけ?
219 :
NAME IS NULL :2010/01/19(火) 00:43:31 ID:jEOiz32W
>>218 早速の回答ありがとうございます。
それですと、3件表示されて、その後プログラム上で数える処理を実装しなければいけなく困っています。
できれば、SQLだけで完結したいです。
イメージとしましては、こんなイメージです。
--------+-
aaaaaaaa 1
bbbbbbbb 2
SELECT SAB_TABLE1.col1,COUNT(*) FROM ( SELECT COLUMN1 AS col1,COLUMN2 AS col2 FROM TABLE_NAME GROUP BY COLUMN1,COLUMN2 ) AS SAB_TABLE1 GROUP BY SAB_TABLE.col1; じゃ、冗長?
エイリアス と GROUP BY間違えてた SELECT SAB_TABLE1.col1,COUNT(*) FROM ( SELECT COLUMN_1 AS col1,COLUMN_2 AS col2 FROM table_name GROUP BY col1,col2 ) AS SAB_TABLE1 GROUP BY SAB_TABLE1.col1;
222 :
NAME IS NULL :2010/01/19(火) 01:00:23 ID:jEOiz32W
>>221 ありがとうございました。
こちらの環境でやったところ、上手くできました。
本当に助かりました。
>>222 つ COUNT(DISTINCT *)
ロシアと中国とか 頼むにしても相手ってもんがあるだろうよ・・・
まあしかしオラクルによる買収は迷惑なハナシだ
229 :
NAME IS NULL :2010/01/21(木) 20:42:20 ID:i4vUF73z
プロシージャ内でテーブル名を生成して操作したいんですが、どうすればいいですか?
ttp://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=34266&forum=26&2 上記などを参照してプリペアド文を作ってみて
SQL自体は通るんですが、実際にCALLするとエラーになります。
PROCEDURE dbxxx.spName can't return a result set in the given context
環境はMySQL5.1.37+PHP5.2.11で、プリペアドさえ外してテーブル名を直接指定すれば
他の部分は問題なく、SELECT @〜 で返り値も取得できる状態です。
ちなみに件のテーブル自体も次々に自動生成されるものになっていて、
varNumberはその時の状況で変わります。
CREATE PROCEDURE spName (
中略
BEGIN
DECLARE varNumber MEDIUMINT UNSIGNED DEFAULT 0;
中略
SET @stmt = 'INSERT INTO ? SET
time = varTime,
id = varId,
value = varValue ' ;
PREPARE stmt1 FROM @stmt ;
SET @str = CONCAT( 'TB_log_', varNumber ) ;
EXECUTE stmt1 USING @str;
DEALLOCATE PREPARE stmt1 ;
中略
END
↓
CALL spName(@out1,@out2, '$num', '0000000000' , '00' , 'xxxxx' ) ; →この段階でエラー
SELECT @outData1, @outData2 ;
PHPもSQLも経験1ヶ月程度で理解度が中途半端な上に、少し急ぎなので、
できれば具体的にコードを示してもらえると助かります。
よろしくお願いします。
230 :
NAME IS NULL :2010/01/21(木) 21:23:03 ID:i4vUF73z
すみません、補足です。 上の例だとテーブル名生成する意味なさそうに見えちゃいますが 実際にはプロシージャ内で他のテーブル項目を参照したりして その条件によってvarNumberが変化します。
firebirdが脚光を浴びる日がくるか・・・? 無いか
233 :
NAME IS NULL :2010/01/23(土) 05:23:08 ID:g6vupv1F
>>232 MySQLがぽしゃっても、MariaDBか、PostgreSQLに行くだろ。
ま、オラクルもMySQL Enterpriseが潰せたら、スモールビジネス向けのMySQLには
頓着しないだろ。
235 :
NAME IS NULL :2010/01/23(土) 23:25:16 ID:zaDBVqlQ
select * from 〜 into outfile''〜文をどのようにJavaに組み込めば実行できるか教えてください
そのまんまできたよ Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/scott", "scott", "tiger"); Statement stmt = conn.createStatement(); stmt.executeQuery("SELECT * INTO OUTFILE 'test.txt' FROM emp"); stmt.close(); conn.close(); ・あらかじめ grant file on *.* to xxx@yyy; しておく ・ファイルはサーバ側に作成される
237 :
NAME IS NULL :2010/01/24(日) 01:00:54 ID:VdUFimnY
ありがとうございます。助かりました。
238 :
NAME IS NULL :2010/01/24(日) 02:41:54 ID:T0Fkwc0r
Mysql初心者です。 環境はMYSQL5.1.39+Windowsで、 INTO OUTFILEでCSVファイルを出力したのですが、 どうやってもファイルの文字コードがUTF-8で出力されません。 どうか助けてください。(´Д⊂グスン select * from [テーブル名] into outfile [出力ディレクトリ] fields terminated by ',' optionally enclosed by '"' lines terminated by '\r\n'; mysql> SHOW VARIABLES LIKE 'char%'; +--------------------------+----------------- | Variable_name | Value +--------------------------+----------------- | character_set_client | utf8 | character_set_connection | utf8 | character_set_database | utf8 | character_set_filesystem | binary | character_set_results | utf8 | character_set_server | utf8 | character_set_system | utf8 | character_sets_dir | XXXXX +--------------------------+-----------------
>>238 イヤです。
・・・せめて、WINDOWSのバージョンぐらい書け。
あと、Windowsのバージョンとかどうでもいいだろ
242 :
NAME IS NULL :2010/01/24(日) 09:50:54 ID:T0Fkwc0r
244 :
NAME IS NULL :2010/01/24(日) 17:29:07 ID:ZODmn3QN
http:// ◎◎◎.com:1111でコンパネログイン画面ににだれでもアクセスできるんですが
.htaccessとかでIPのアクセス制限とかかけなくても平気なんでしょうか?
しかしindex.htmlとplesk-statしかフォルダがないのですが…。
:1111ってなんなんでしょう?
それってここで聞くことなのかな
247 :
NAME IS NULL :2010/01/24(日) 17:56:48 ID:ZODmn3QN
>>245 飛ばしてくれるとありがたいです。
データベース・・・webprogかな?
すみません。
programじゃないだろ、どっかネット関連だけど。1111はポート番号
250 :
NAME IS NULL :2010/01/24(日) 22:16:05 ID:ZODmn3QN
赤帽がMariaDBを選択するだろうか・・・ 鳥に入ってないDBは使う気になれんから気になるところだ
Red HatがいまMariaにする理由はないんじゃないかな 5.1系列の間は何も変わらんと思う
253 :
NAME IS NULL :2010/01/26(火) 23:32:24 ID:bxD2KtiS
| character_set_database | utf8 さくらではujis→utf8変更無理ですか?
256 :
NAME IS NULL :2010/01/28(木) 01:04:08 ID:JHyNBd8j
flashでmysqlを使いたいので、livedoorのレンタルサーバーかりてみました。 php等を使うといいということで、本を何冊かphp、mysqlの本を買ってみたのですが、 大まかな流れとしては、flashとphp,mysqlどうやって連携するものでしょうか。 キーワードになるコマンドみたいなのを教えてもらえると 今後のおおまかな方向付けができると思うのですが、 漠然とした質問ですが答えていただける方いたら何かコメントお願いいたします。
258 :
256 :2010/01/28(木) 06:29:46 ID:???
>>257さんありがと 「PHPはCommon Gateway Interface (CGI) をサポートしており、CGIをサポートするWebサーバ上でPHPスクリプトを実行することができる。」 phpをwikiで調べてみたところ(上記引用)、CGIはPHPで書くことができると考えていいと思うので、 PHP≒CGIみたいなイメージで考えいます。
情報系大学いっているんだが全くわから任で質問させていただきたくて惨事奉りました。 MySQLにて3つのテーブルを使っての作業です。 Table : list , user , relation の三つのテーブルが有ります。 list : list_id , list_name , list_owner user : user_id , user_name relation : listed_user_id , list_id , listing_user_id の項目があります。 relationにある listed_user_id を userのuser_id で結合して user_name を表示して relationにある listing_user_id を userのuser_id で結合して user_name を表示して relationにある list_id を listのlist_id で結合して list_name を表示したいんです。 ここで最初の二つのlisted_user_idとlisting_user_idが同じuserからの結合というところでうまく構成できずにいます。 ご助力お願いします。
>>259 FROM句には同じテーブルを複数回書ける
FROM user u1, user u2, ...
WHERE u1.user_id = ...
AND u2.user_id = ...
データベースtestAをコピーして、testBを同じPCに作りたいのだけど、 Windowsだとmysqlhotcopy が無いみたい。 mysqldumpで試したけど、うまく出来なかった。 どうすればいいの?
MyISAMだけならhot copyじゃなくてcold copyすればおk
264 :
262 :2010/01/28(木) 22:45:02 ID:???
5GB以上のSQLファイルを一気に登録できる方法ないですかね?
何かオンライン・マニュアルが読めなくなったんだけど... ページのフッタにはOracleとか表示されてるし...
>>266 コマンドとかで1回で出来ないですか??
5Gだと、メモリ消費エラーとかで分けれないんです・・・
>>268 それならメモリ増やすしかないような気がする。
>>259 SELECT
T1.list_id,
T2.list_nm,
T3.user_name,
T4.user_name
FROM relation T1
LEFT OUTER JOIN list T2 ON T1.list_id = T2.list_id
LEFT OUTER JOIN user T3 ON T1.listed_user_id = T3.user_id
LEFT OUTER JOIN user T4 ON T1.listing_user_id = T4.user_id;
これででないかな?
272 :
NAME IS NULL :2010/01/31(日) 17:30:16 ID:bfO+B9ix
レス遅れてすみません!
>>271 できました!
複数指定しなくちゃいけないということとLeftOuterJoinがLeftJoinのことを知りませんでした。
ありがとうございました。
MySQLで 1-.まず一度抽出する→A 2-AのA1を持つデータを抽出 3-A1を持つA2が持つA1をすべて書き出して数を数える。 ってことをしたいんだけど複雑でわからない・・・。 例 くだものテーブルA 果物名A1 持ってる人A2 りんご 山田 りんご 渡辺 りんご 鈴木 バナナ 山田 バナナ 渡辺 バナナ 伊藤 すいか 山田 すいか 鈴木 すいか 佐藤 メロン 清水 出したい結果 りんご りんご3 バナナ2 すいか2 バナン りんご2 バナナ3 スイカ1 すいか りんご2 バナナ1 すいか3 メロン メロン1
>>273 A1を持つA2が持つA1を・・・の時点で
A1-A2-A1´
りんご 山田 りんご
りんご 山田 バナナ
りんご 山田 すいか
ってテーブルをイメージすると
SELECT
FT1.fruit_nm,
FT2.fruit_nm,
COUNT(FT1.cst_nm)
FROM fruit_table FT1
LEFT OUTER JOIN fruit_table FT2 ON
FT1.cst_nm = FT2.cst_nm
GROUP BY
FT1.fruit_nm,
FT2.fruit_nm;
ででないかな?
275 :
NAME IS NULL :2010/02/01(月) 01:05:49 ID:MIUeLjfW
INSERT IGNOREを使ってみたいのですが 今一つかいどころがわかりません。 PRIMARY KEYが重複してはいけない時点で IGNOREを満たしているようなきがするのですが・・
PRIMARY KEYが重複したときエラーを無視して何もしないのがIGNORE IGNOREなしだと、SELECTして重複しないことを確認してからINSERTとか INSERTしてみてエラーが返ってきたらハンドリングして次とかするので プログラムが長くなる
277 :
phpmyadmin :2010/02/03(水) 23:30:04 ID:dbRFvm9u
phpmyadmin関する質問です。 [インポートするファイルの形式]の一覧にCSV,LOAD DATAするCSVが表示されません。 表示させるにはどうしたらいいのでしょうか。 ご助力いただければ幸いです。 環境 phpMyAdmin - 2.11.10 MySQL 5.0.45
278 :
phpmyadmin :2010/02/03(水) 23:47:25 ID:dbRFvm9u
279 :
NAME IS NULL :2010/02/04(木) 06:19:11 ID:uuf0Gj4A
よかった
text型ってindex設定できないですか? 検索のときすごい遅いです。
FullTextインデックスがあるじゃまいか 日本語では単語のデリミタ区切りの問題で、あまり効かないけどね
失礼します。質問させてください。 会社でサーバーのCPU使用率などをWindows標準のパフォーマンスカウンタで SQLに記録していこう、という話になりました。 そこで試しにWindwosXPからログをSQLに書き込もうとしたのですが、必ず失敗してしまいます。 MySQLのデータベースは用意したのですが、原因がサッパリ解りません。 とりあえず手順として、MySQL ODBC コネクター5.15をインストールしてシステムDSNを登録して そこまではきちんと接続できるのは確認したのですが、いざ記録先に指定して書き込もうとすると必ずエラーになります。 とりあえず方法は置いておくとして、Windows標準のパフォーマンスカウンタでMySQLに記録できるのでしょうか? よろしくお願いします。
「SQLに書き込もう」とは? 「必ずエラーになります」ってどんなエラー?
質問させてください。 ↓のクエリでサブクエリの結果のカウントも一緒にセレクトしたいんですが可能でしょうか? SELECT count(id) FROM test WHERE id NOT IN (SELECT DISTINCT id FROM test WHERE status = 0);
無理かと思ったけど、結構出来るもんだな
既出かもしれないが、ライセンスの除外規定がよく分からないので、質問。 PHP5.2で自家製Wikiを作っているんだが、修正BSDライセンスにしておけば、 バックエンドがGPL版MySQLでもソフトウェアの配布ができる? あとFOSS除外規定って、PHPに限らず、PythonやRubyやJavaでも ソフトウェアのライセンスがBSDライセンスやMPLならば配布可能ってこと?
>>286 そうだと思う
たいがいのOSSライセンスのソフトウェアにlibmysql混ぜていいはず
289 :
NAME IS NULL :2010/02/07(日) 11:25:35 ID:2/A0vCNo
テーブルの特定の行の内容を、別のテーブルにコピーすることはできるんでしょうか? アンケートというか投票システムを作りたいです。 質問用テーブルt_question(ID、質問タイトル、質問本文 の3つのカラム)があるとして、 これに対して、「Yes」「No」の二択で投票するとします。 普通だったら 投票用テーブルt_answerは(ID、t_question.ID、Yes_No)の形にすればいいかと思うんですが、 事情があって、t_answerを ID、Yes_No、t_question.ID、t_question.qTitle、t_question.qTextの形にし、元の質問用テーブルの 中身を投票時に投票用テーブルにコピーしたいのです。 どうしたらいいでしょうか? (質問情報をhiddenで引き回して裏で一緒に登録とかでなく、何かmysql関数?を使ってスマートに 実現する方法を知りたいです) 根本的には、こんなことをする理由は質問用テーブルの情報(行)が 上書き更新されてしまうので、投票時の情報を保存したいというのが理由です。 上のやり方以外にも 質問情報を登録時に同時に保存用テーブルにコピーする(二つのテーブルに同じ質問情報をinsertする) 方法もあると思います。そうすれば、質問情報が上書き更新されても保存用テーブルで元のデータがたどれるので。 きっとほかにもいろんなやり方・考え方があると思いますが、おすすめの手段 自分だったらこうするというものを教えてもらえると助かります。 わかりにくくてすみませんが、よろしくお願いします。
SELECTの部分は通常のSELECT文と同じだから UPDATEしなくても好きに加工できるよ。CASE使ってもいいし
TSVからphpmyadmin経由でインポートする際に、 MySQLで言うところのNULL(\N)ではなく、文字列の"null"としてインポートしたい箇所があるのですが、 not_null制約に引っかかってインポートできません。 大文字の"NULL"や小文字の"null"もそうですが、"Null"なんかもあります。 文字列として取り込むにはどうすればいいでしょうか?
`null` とする?
>>293 あざーーーーーーーーーーーーーーーす!!
無事解決しました。
295 :
ぷくぴゅん :2010/02/08(月) 00:58:28 ID:nvhZ9pdY
質問なんですがmysql5.1のwindows番でslow logのテーブル内容を 削除にするにはどうすればいいでしょうか? 普通にdeleteやdropを使おうとするとlockされてますとでてしまいます。 このロックを外すには?
`null` ぽする?
アプリケーションサーバーとMySQLを同時に動かしている環境では問題無いのに、 ネットワーク(TCP/IP)経由で分けるとパフォーマンスが悪化する場合どんな所に原因があると思われますか?
298 :
289 :2010/02/08(月) 14:00:34 ID:???
回答くれたみなさん、ありがとうございました。 やっぱりテーブルと処理の構造に問題がありますね、、 考え直してみます。ありがとう
>>283 >>282 です
今日、出社してログをコピーしてきました
少し長くなりますが、以下がそのエラーです
MySQLコネクタ単体でのアクセスが出来るのは確認済みです
パフォーマンス ログ名がCPU_TEST(テストでCPU使用率のログ)で
ServerLogがODBCのシステムDSN名です
【ポップアップエラー】
CPU_TEST ログまたは警告は開始されませんでした。
現在の状態を表示するには、ログまたは警告の一覧を最新の情報に更新してください。
またはアプリケーション イベント ログでエラーを参照してください。
ログと警告によっては、多数のカウンタが含まれる場合など 開始するのにしばらく時間が必要となることがあります。
【アプリケーションログ】
・エラー
イベント ID (3042) (ソース PDH 内) に関する説明が見つかりませんでした。
リモート コンピュータからメッセージを表示するために必要なレジストリ情報または
メッセージ DLL ファイルがローカル コンピュータにない可能性があります。
この説明を取得するために /AUXSOURCE= フラグを使用することができる可能性があります。
詳細については、ヘルプとサポートを参照してください。
次の情報はイベントの一部です:
[MySQL][ODBC 5.1 Driver][mysqld-5.0.77]You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTITY PRIMARY KEY, MachineName varchar(1024) NOT NULL, ' at line 1.
・エラー
[PDH(ID:3042)]
イベント ID (3042) (ソース PDH 内) に関する説明が見つかりませんでした。
リモート コンピュータからメッセージを表示するために必要なレジストリ情報または
メッセージ DLL ファイルがローカル コンピュータにない可能性があります。
この説明を取得するために /AUXSOURCE= フラグを使用することができる可能性があります。
詳細については、ヘルプとサポートを参照してください。
次の情報はイベントの一部です:
.
・警告
[SysmonLog(ID:2004)]
サービスは、ログ CPU_TEST のログファイル: SQL:ServerLog!CPU_TEST を開けません。サービスを停止します。
ログ フォルダの存在、スペルおよびアクセス許可を確認して、 このログ ファイルに書き込んでいる
ほかのログやアプリケーションがないことを確認してください。
構成プログラムを使ってログ ファイル名を再入力しすることができます。
このログは開始されません。 返されたエラーは、: です。
詳細な情報は、
http://go.microsoft.com/fwlink/events.asp の [ヘルプとサポート センター] を参照してください。
DBのデータ書き込みについて初歩的な質問です。 x,y,suuchiという三つの項目があるとして、 7,8,60という値を一度書き込んだ後、 もう一度 7,8,59という値を上書きしたいのですが、 DB上は 7,8,60 7,8,59 という2つのデータが残ってしまいます。 できれば、 7,8,60というデータは消えて 7,8,59というデータだけ残るようにしたいのですが、 手動で書き込みする際に古いデータを消さなくてはならないのでしょうか? うまく説明できませんが、答えてくださる人いましたら教えてください。
update where
>>303 Syntax Errorでそうかな、とは思ってたんですが、Windows標準のパフォーマンスカウンタには
クエリを書く項目が無くて、設定もできない状態でして……
やりたい事はリモートでサーバーのCPU使用率、メモリ使用率を取得して
それをMySQLに記録していく事なんですが、無理なんでしょうか…
ODBC経由のSQL書き込みの部分で詰まってしまってます
せめて出来るか出来ないか、だけでも解れば凄く助かります
>>305 なにか、壮大に出だしで間違ってる気がする……。
307 :
301 :2010/02/09(火) 21:35:00 ID:???
>>305 出来るか出来ないかで言うと、出来る。
お金をくれたらやってあげる。タダではやらない。
x, y カラムを指定して、suuchiカラムに値をUPDATEしたいのですが、 通常のデータの追加であれば、 INSERT INTO `sample` ( `x` , `y` , `suuchi` ) VALUES ( '1', '1', '54' ); になると思いますが UPDATEとWHEREを使うとどうなるのでしょうか?
309です。 とりあえずMYSQLの本では UPDATE テーブル名 SET カラム名=設定値 WHERE 条件; となっているのですが・・・。 なんかそのままでいいのかな?
UPDATE `sample` ( `x` , `y` , `suuchi` ) set `suuchi`= '$strs[2]' WHERE (`x`='$strs[0]'&& `y`='$strs[1]' ) 自分でコードを書いてみましたがうまくいかないみたいです・・・ 神様助けて・・・
312です WHEREの後の条件文の書き方がだめなのかとおもうんですがどうでしょうか?
UPDATE `sample` ( `x` , `y` , `suuchi` ) SET `suuchi`= '$strs[2]' WHERE `x`='$strs[0]' AND `y`='$strs[1]' setが小文字だったので大文字にしたのと、()付きの&&じゃなくてANDに書き換えてみましたが、 これでもダメみたいです。
UPDATE `sample` SET `suuchi`= '$strs[2]' WHERE `x`='$strs[0]' AND `y`='$strs[1]' じゃないの?
Excel + MySQL 5.1.42 mysql-connector-odbc-5.1.6-win32.msiをインストールしたのですが -2147467259 [MySQL][ODBC 5.1 Driver]Access denied for user 'ODBC@localhost' (using password;'YES') のメッセージが出て接続が出来ません。 3.51だったら正常に接続できるのですが、何か設定とかする必要ありました? 管理ツールのデータソースでユーザーDSN及びシステムDNSNに登録もしてみました が(そこでの接続テストはOK)。 DB_CnString = "DRIVER={MySQL ODBC 5.1 DRIVER};" _ & " SERVER = localhost;" _ & " DATABASE = *****;" _ & " UID = ******;" _ & " password = ******;" _ & " STMT=SET CHARACTER SET cp932;" _ & " OPTION =3 " MySQL ODBC 3.51 DRIVER の3.51の部分を5.1に変えただけなんですが。
318 :
NAME IS NULL :2010/02/10(水) 13:23:31 ID:LGfolNfx
質問します。 今、会員制サイト(一般ユーザの見れる情報サイトで、会員がログイン後情報を編集できるみたな)を 作っています。そこで会員管理のテーブルをどうしたら良いのかアドバイスください。 現在のところ、会員のプロフィールテーブルに id,userName,userType,age,hobby,...,loginPass,loginName,role という感じでプロフィールなどの 公開情報と一緒にログインパスワードやログイン名をまとめています。 これでいいと思って作ってきたんですが、問題発生する可能性あるでしょうか? プログラムがだめだったらどんな構造でも問題になるでしょうが、テーブル構造の セオリーとかわからないのでご意見お願いします。 環境はMysql5, php5使ってます。
セオリーというならリレーションの正規化について勉強なさい その後で、バッドノウハウとしてパフォーマンスのために非正規化した方がいいところor正規化したままの方がいいところを学ぶ、と あと老婆心ながら、loginPassは生のまま入れないこと 管理者にすら分からないようにして、ユーザが紛失した場合は再発行させるのがセオリー
質問させて下さい。 以下のようなテーブルがあります。 [ID] | [Value] A あああ A いいい A ううう B ええええ B おおおおお これを、次のような形でSELECTすることは可能でしょうか。 [ID] | [ValueAll] A あああ,いいい,ううう B ええええ,おおおおお
315,316ありがと。うまく更新できた!!
MySQLを勉強しだしたばかりの基本的な質問ですいませんが 日付が入ったDatatime型のカラムから一番古い日付のデータを取り出す場合 SELECT データ FROM テーブル WHERE カラム??? 最後の方がわかりません。 たぶん条件式ではなく関数を使う必要があると思うのですが。 ご教授お願いいたします。
SELECT データ FROM テーブル WHERE min(カラム)
データベースにデータを追加するときは、1項目筒しかできないのでしょうか? 一気に数十個のデータをテキストファイルなどから読み込んでデータを追加することはできないものでしょうか?
>>324 SQLで表現できるのは1レコード分のINSERTだけ。
>一気に数十個のデータをテキストファイルなどから読み込んでデータを追加する
それはプログラミング言語側の仕事。
325ありがと。 プログラミングで1レコードのINSERTを繰り返し実行するほうほうでがんばってみる。
>>325 BULK INSERT 出来なかったっけ?
>>327 ,328ありがと
技術評論社のポケットリファレンスで LOAD DATA INFILEのページp295
を読むとCSV形式のファイルが読み込めるみたい!!。
330 :
329 :2010/02/11(木) 03:32:29 ID:???
ポケットリファレンスに紹介されてたODBCをインストールしたらエクセルでデータベースのデータが見れるようになった のでびっくり。MYSQLってエクセルと相性がいいみたい。 これはMYSQL初心者にとっては奇跡のようにうれしい!!
ODBC使うとエクセルだけで見れるの? アクセスいるのかと思ってた。あさって試そう。
332 :
329 :2010/02/11(木) 04:21:34 ID:???
次のようなファイルを作ってみたのですがうまくCSV読み込めなかったです。 アドレスの最後に?をつけるとfaultというメッセージが出るのですが、 ?をつけなければsuccesともfaultとも表示されません。 これどこが悪いのか分かる人いたらコメントください。 #!/usr/bin/perl use DBI; print "Content-type: text/plain; charset=utf-8\n\n"; $dbh = DBI->connect("データベース名", "ユーザ名", "パスワード"); $sth = $dbh->prepare("LOAD DATA INFILE `CSVファイル名.csv` INTO TABLE `shogiban2` FIELDS TERMINATED BY `,` "); #SQL実行 $rv = $sth->execute; $sth->finish; $dbh->disconnect; if ($rv) { print "success"; } else { print "fault";
ODBCなんてメジャーなDBならどれでも対応してるけどな。
LOAD DATA INFILEは…
まあ俺が勝手に思ってるだけかも知れんけど、あれはDBの引越しとか、何かアクシデントで
バックアップから戻すとかの単発(に近い)作業で、超大量のレコードをインポートしたいとかに
使うもんじゃないかなあ。それこそmysqlコマンドライン上で手打ちで使うような。
数十レコード程度なら、普通にINSERT使っても大して時間食わないでしょ
>>332 とりあえず、LOAD DATA LOCAL INFILE〜
とするとどうなる?
335 :
NAME IS NULL :2010/02/11(木) 10:52:41 ID:YFVlJadY
テーブルにデータを10件確実に登録する必要がありループでinsert処理しようとするとき プリペアドステートメントを使うほうがいいと本に書いてありましたが、 このときトランザクション処理の必要があるんでしょうか? プリペアドステートメントがループ処理に向いてる方法らしいので、 する必要なかったりするのかな?という疑問です。
確実に登録するならトランザクション必要 プリペアドステートメントは性能に影響するけど確実性には無関係
337 :
329 :2010/02/11(木) 11:47:53 ID:???
>>334 LOAD DATA LOCAL INFILEとするとアドレスに?をつけても付けなくてもfaultとのメッセージが出る。
これはCGIのプログラムは間違ってないけどうまくCSVが読み込めないってことなんだろうか?
>>320 select id,group_concat(value) from tbl group by (id);
perlは知らないけど、ざっと見てsuccess/faultが決まるのはMySQLに実行を依頼した結果だよね? じゃあ、 A.perlでMySQLを使うやり方として間違いは無いか B.MySQLに渡したSQLにエラーは無いか を確かめるってことになる。 まずはBに関して、そのLOAD DATA....を手打ち実行させてみては?
341 :
329 :2010/02/11(木) 14:24:44 ID:???
>>340 とりあえず文法間違いみたい。
でもどこが間違ってるかわからない・・・。
LOCALをいれても同じメッセージが出る。
エラー
実行した SQL:
LOAD DATA INFILE `shogishokika.csv` INTO TABLE `shogiban2` FIELDS TERMINATED BY `,`
MySQLのメッセージ:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'shogishokika.csv` INTO TABLE `shogiban2` FIELDS TERMINATED BY `,`' at line 1
ファイル名は文字列リテラルだから、バッククォートじゃなくてシングルクォート `shogishokika.csv` 'shogishokika.csv'
343 :
329 :2010/02/11(木) 14:56:33 ID:???
>342 ありがととりあえず文法間違いは直ったみたいだけど、 まだエラーメッセージが出る。 こんどはアクセス権限の問題みたいなので、レンタルサーバーの会社に聞いてみる MySQLのメッセージ: #1045 - Access denied for user●●
そこで今度はLOCALつけてみようぜ
345 :
329 :2010/02/12(金) 03:16:51 ID:???
>>344 LOCALつけると違うメッセージが出るけど、つかってるMYSQLのバージョンでは、
このコマンドは許可されてないということらしい。
自作サーバーじゃなくてレンタルサーバーだからアクセス権限が管理者権限じゃないのが原因かな?
とりあえず、レンタルサーバ会社に質問をメールして返事待ってるとこ。
MYSQLって構造が分かるともっと楽しくなる予感がする。
でもそこまでは僕みたいな素人ではなかなか無理かな・・・。
(できる範囲で頑張る!!)
MySQLのメッセージ:
#1148 - The used command is not allowed with this MySQL version
win版mysql5.5のバイナリってなくなったの?探しても見つからないんだが
ありますん。
348 :
NAME IS NULL :2010/02/12(金) 17:25:34 ID:wrXxMc4Q
すいません、質問させてください。 ある条件を入れるとexplainでfilesortが出現するのですが これを回避するにはどのような方法が考えられますか?
349 :
NAME IS NULL :2010/02/12(金) 23:06:14 ID:a5jSNvr8
unixのmysqlについて。 mysql-5.1.43-solaris10-i386.tar.gzをダウンロードし、解凍したんですが、./configureファイルが見つかりません。 ダウンロードするファイル間違っているでしょうか?
350 :
NAME IS NULL :2010/02/12(金) 23:35:43 ID:a5jSNvr8
349です。 すいません。解決しました。ダウンロードファイル間違えていました
>>348 その聞き方じゃ「ある条件を外す」としか答えられないでしょう
352 :
346 :2010/02/13(土) 14:20:48 ID:???
>>347 ありがとうございます
MySQL6みたいに廃止されたのかと思ってました
探しても見当たらないのですがもしよろしければリンク先を教えていただけませんか?
jaistあさってみ
354 :
NAME IS NULL :2010/02/13(土) 17:34:26 ID:Oj+bJoB0
2つのキーを同時にLIKE検索したいのですが、どのように記述すればよいでしょうか? これだとだめでした。 where key1, key2 like '%str%'
where key1 like '%str%' and key2 like '%str%'
356 :
NAME IS NULL :2010/02/13(土) 18:50:11 ID:Oj+bJoB0
>>355 やっぱりそれしかないですか、、
どちらかに含まれていればよいのでandをorに変えてそれでいきます。
誰か聞いてくれよ 今開発している案件のDBが、MySQL-inodbからMySQL Cluster-ndbclusterにストレージエンジンが変更になったんだよ。 俺の構想では、MySQL-inodbをレプリケーションしてスレーブ作って、負荷分散させようと考えてたんだよ。 そしたら1次請の会社のSEが、MySQL Clusterを使うって方針に決まったから、MySQL Clusterについて調べろっていうんだよ。 自社でテスト環境作ってたら、データノードのプロセスが突然落ちる>そしてデータノードのプロセスが起動しなくなってDBをcreateしなおして、レストアしないといけないのよ。 後は、configのパラメータの中身が意味不明。開発者向けのスイッチかと思われるほどの無残さ。 joinが遅いとか、configを帰ると3時間ものローリングリスタート。時々落ちるおまけつき。 deleteで消した行の領域は、リスタートしないと開放されないとか…。 俺の感想だと糞DB。バグだらけ これほんとに運用されているシステムで使われているのか? 誰か使ってるやついたらなんか教えてくれ?
素直にOracleを使わないからだろう。一次請けになれないことを恨むんだな。
>>357 勘どころが掴めれば、まあOracle程度には安定するよ。
素のMySQLレベルの安定性は望めないけど、その程度で妥協するしかない。
360 :
354 :2010/02/13(土) 21:00:30 ID:???
これでいけました スペース入れてるのは、誤検索を防ぐためです。 where concat(key1, ' ', key2) like '%str%'
361 :
NAME IS NULL :2010/02/13(土) 21:19:48 ID:sfn0mbmG
すいません、ちょっと疑問に思った事なのですが mysqlの権限やセキュリティに関する部分で 例えばmysqlっていうユーザーにあらゆる権限を与えていた場合、他のユーザーが mysqlユーザーに成りすまして mysql -u mysql -p で辞書アタックみたいな事をすると、防衛手段としてはパスワードを強固にすると いう対策だけで万全ではないと感じました。 ですので、例えばwebサーバー(apache)からphpなんかが実行された場合のユーザーは apacheの実行ユーザーに準ずる訳なので、apacheユーザーがmysqlユーザーになりすま し出来ないって設定が出来れば、多少強固になると感じたのですが こういった設定は可能でしょうか
>>358 やっぱりそうだよね。
最初はOracleだったんだけど、予算的な問題で、MySQLレプリケーション
それで、どこかのコンサルの入れ知恵でMySQLCluster。
これほんとにバグだらけで運用どころか開発もできる気がしないわ。SUNとかにコンサル頼むと、製品版とコンサル料金で2000万ぐらいいくらしい。
素直にOracleの方がやすいんじゃないかと。
>>359 今の所まったく安定しないのよ。ほんとにできるの?
データノード追加する度にDBクラッシュしたり、ディスクテーブルにSELECTすると、めちゃくちゃ遅いし。
ノードが落ちてもトランザクションの保障すると書いてあるのに、接続切れるし。
公式のマニュアルは間違いが多いし、開発者のオナニーにつき合わされている感じがしすぎ。
今のところ、妥協レベルのデータベースであることは間違いなさそうだわ。枯れてきていい感じに使えるにはあと3年ぐらいの予感が。
これを使わされるユーザさん可愛そうだわ。
途中でデータ消えたらユーザ激怒で修羅場が用意に創造できる・・・。
363 :
359 :2010/02/13(土) 22:00:24 ID:???
>>362 毎日、毎時、毎分が新発見だけどね。
トラブルが発生しない間はノートラブル ってレベルになら
割と早い段階でたどりつけるよ。
>>363 確かに、毎日、毎時、毎分が驚愕の事実の新発見なのは間違いないよ。
安定しているとはうらやましい。俺はこれが運用に耐えられないとPMを説得中なんだよ。
スケールアウトしない前提でONメモリデータベースのみ使う場合は安定してる感じなんだけど、スケールアウトのとか障害テストをするとホントだめだめ。
俺が今の理解している範囲では、MySQLCluster強烈なクセがあり、以下のルールを守らないと使い物にならない感じが。
・selectする際は必ず、pkeyを指定すること。しない古代のDB並に遅い。joinはもってのほか
・indexをふってもwhere句の指定がrangeだとまったく効果なしというか遅い。
・メモリテーブルに展開するデータは、基本selectとupdateを繰り返すデータ向き。
insert/deleteを繰り返す処理には確実に向いていない。
・ディスクテーブルはおまけ程度の機能。普通のinodb以下の性能になる。
・SQLノードを増やせば早くなる。
・データノード数を増やしても遅くなるか、今の処理性能を維持するぐらい。消して早くはならない。
・スケールアウトはできるけど、それによるデータベース破損のリスクがある(バグってる)。
・基本的にコンサルやサポートを受けて成立するものであって、素人がMySQLの延長線上にあるぐらいで使おうとすると火傷し、結局サポートに大金を支払うという事態になる。
KVSの延長として使うものなんだろうなあ Oracleに買収されて、TimestenとCoherenceという優秀な製品がある中で MySQL Clusterの先行きは大変気になるところ っていう線でPMと話してみたら?
すいません、教えてください SELECT id,カナ,名称 FROM tbl WHERE 名称 LIKE あ% ORDER BY カナ 上記のような場合 カナにインデックスを定義するメリットありますか? (名称にはインデックス無しの前提で)
BIGINT 型のID という名のカラムがプライマリキーで、オートインクリメントのデータ構造を持つテーブルです、 レコードを削除し、追加した場合、ID は連続しないことは周知の通りなのですが なんとか、1234・・・ という具合に連続的にID 追加する方法はないのでしょうか?
削除したらすべての番号ふりなおすの? 毎回何番目か数えたら?
mysql5.0.77 on centos5.4(ext3)の環境で不思議な現象が起こっています とあるユーザーに権限を与えましょう、と以下のコマンドを実行しました mysql> grant select,insert,update,delete,index,alter,create,drop on `testdb`.* to `test\_user`@localhost identified by 'パスワード'; phpmyadminにてtest_userでログインし「新規データベースを作成する」の項目が「特権無し」となって こちらはOKなのですが、次にtestdbをtest_dbとすると mysql> grant select,insert,update,delete,index,alter,create,drop on `test\_db`.* to `test\_user`@localhost identified by 'パスワード'; データベース名にアンダーバーが付いたデータベース名でphpmyadminの上述の「新規データベースを作成する」 の項目をみると「特権無し」である筈が「test?db」となっていて作成が受け付けられている状態でした。 ためしに「作成」をクリックすると普通に作成できてしまいました。 ちなみにtest?db2やtest_db2等は作成できず、アンダーバーをクエスチョンマークに置き換えた データベース名のみ作成可能なようです。 シェルからも同様で「create database test?db」とするとこちらも作成できてしまう状況 なのです。 なぜgrantでtest_dbを操作する権限しか与えていないtest_userがtest?dbというデータベース を作成できてしまうのでしょうか? 識者の方々のご意見を頂戴できれば幸いです
%と_ はワイルドカード
MySQLは||使えないのね、、
>>370 そのワイルドカードはlike句でしか解釈されないだろ。
そういう文脈じゃないのにのにわざわざバックスラッシュ付けている
からじゃないのかなぁ?試してないけど。
ttp://dev.mysql.com/doc/refman/4.1/ja/grant.html >注意: GRANT コマンドでデータベース名を指定する際、‘_’ および ‘%’ ワイルドカードを使用できます。
>データベース名の一部として、たとえば ‘_’ 文字を使用したい場合、GRANT コマンドでは
>GRANT ... ON `foo\_bar`.* TO ... などのように、'\_' として指定するようしてください。
>そうしないと、ワイルドカードパターンに一致する別のデータベースにもユーザがアクセスできるようになります。
らしいよ。
369です
>>375 あれ、とすると今回キチンと `foo\_bar` て指定ししたのに結果的にワイルドカードとして処理された
って事になりますよね。
なんでだろ?
どなたか同じ現象になった方いらっしゃいませんか?
>> 365 さんくす
今、cakephpを使って開発してるんですけど、DBの負荷が上がってきたら 何らかの対策をしないといけないと思っています。 たとえばカウンターのスクリプトを他のユーザーに貸し出すサービスがあるとします。 その場合は ・ユーザーID 1000 の人は DB 1 を ・ユーザーID 1001 から 2000の人は DB2 を 使う というように分ける という考え方で良いのでしょうか。 ご指導下さい。先輩方!
水平分割だっけ。
>>376 phpmyadmin経由だからかもよ?
\\にしてみたら?
コマンドラインクライアントだったら?
Cluster云々でふと思い出したんだけど kumofsってどーなの? KVSだから通常のRDBとしては使えない?
MySQLをスケールアウトしようとすると、どういう実装方法があるのかな? レプリケーションとmysql-proxyを使う方法が一般的?
385 :
NAME IS NULL :2010/02/16(火) 10:05:10 ID:+TQoVkUi
MySQL Query Browserでlocalhostを指定すると接続するのですが IPを指定すると接続ができません。 何が原因なのでしょうか??
データベース名:mysqlのuserテーブル覗いてみなはれ。 localhostと127.0.0.1は別モノとして扱われてる。
>>386 ありがとうございます・・・
えと、別PCでは何も触ることなく他のPCからQuery Browser等で覗く事ができたのですが
違うPCにまたMySQLにインスコして、違うPCから接続するとエラーになってしまうのですが・・・
MySQL側で何か設定があるのでしょうか?
ListenPortの指定は?
Portじゃねーや、Address
>>388-389 それはMySQL Administratorで行うのでしょうか?
ちなみに正常に他PCから接続できてる方は一切設定せずに接続できてます
あ、すみません。大事な事いうのわすれてました。 OSはXP 64のVersionは2003のサービスパック2です。
Winかい、ファイヤーウォールとかはどうなってるの? ちなみに、ListenAddressの指定は、iniで[mysqld] bind-address 書いてあったら消す方向で
>>392 Winなんですよ><
iniファイルみてみます。ありがとうございます
>>393 ありがとうございます。
さっそく拝見してみます!
>>392-393 で、できました・・・
iniに bind-addressがなかったので、とりあえずgrantで権限設定をしたらできました。
ちなみに、コマンドもよくわからず、書いてるままにやってみたんですが
ipを1つ登録だとうまくいったのですが、既存のユーザー名でip範囲指定をしたくて
grant all privileges on *.* to root@'192.168.1.1/192.168.1.99' identidied by '1234' with grant option;
とすると、登録はされたのですが、192.168.1.19のPCから接続しようとするとエラーになります。
どこがまずかったのでしょうか?
ひょっとしてこれでいけるのかなああ? grant all privileges on *.* to root@'%' identidied by '1234' with grant option; 他のPCの権限のあれみたら%しかかいてないのあったからこれっぽいですね
398 :
NAME IS NULL :2010/02/17(水) 00:06:14 ID:X7/ffKZx
すんません NULLの場合 0 に置換というのは ifnull(HOGE,'0')でいいようですが、 NULLじゃない場合(値が入っている場合) 1 にしたいという場合どうすればいいですかね?
399 :
NAME IS NULL :2010/02/17(水) 00:56:57 ID:76ohbKc+
すみません、質問をさせてください phpMyAdminを用いてカンマ区切りのCSVをインポートしようとしています テーブルにはF1,F2,idの3つのフィールドがあり、idはauto_incrementを設定しています 一方、CSVにはF1とF2に該当するデータしかありません(カンマが1つしかない) そのため、「CSV 入力のフィールド数が不正です 」というエラーがインポート時に発生してしまいます CSVは編集せずに、テーブル、フィールドの設定によってインポート(および自動でidに番号を登録)するにはどのようにすればよいのでしょうか
>>398 case
when column is null then 0
else 1
end as xxxxx
だっけ?(自信はない!
401 :
NAME IS NULL :2010/02/17(水) 11:44:47 ID:YwZz7iYR
AUTO_INCREMENTでない主キーの最大値を取得するのですが、 デフォルトで999という値がある仕様なので これを除いた最大値を取得するよい方法ありますか?
>>398 HOGE IS NULL
あるいは、if(HOGE IS NULL,a,b)
>>401 max(if(n!=999,n,NULL))
CGIとかPHPでMYSQLに接続できるのは分かったのですが、 JAVAってMYSQLに接続するのに向いてますか? もしJAVAでMYSQLの操作ができるなら、何行ぐらいのソースが必要ですか?
>>406 あるがとうJDBCってのがキーワードだね。
すみません。質問します。 あるプログラムがODBCを通してSQLに書き込む際、クエリがMSSQL用でうまくいかない事が解りました しかしプログラムは変えられない為、どうにか対処する方法を探してみたのですが全く見つからず… そこで、MySQLでは実行できないクエリが来たら「変換する」か「無視させる」ような事はできないのでしょうか? よろしくお願いいたします。
・どうにかしてプログラムを変える ・MySQL本体を改造する 好きな方を選べばいいよ
select between '2010-01-05' and '2010-01-10' みたいな感じで 2010-01-05 2010-01-06 2010-01-07 2010-01-08 2010-01-09 2010-01-10 みたいに取るようなSQLは無理でしょうか?
>>411 おっと説明不足でした
レコードがない状態で連番で日付とりたいわけです
>>399 カラム名にカンマ区切りで名前を列挙するんじゃなかったかしら
ユーザー変数定義してやればいい。1文でやるならUNIONしてしまう
php + MySQLで作っていたポータルサイトで携帯電話の動画を扱うことになりました。 各動画は携帯の動画なのでサイズ的には小さいです。 MySQLに動画を突っ込むことは可能ですか? あるいはDB以外の場所に保存しておくべきなのでしょうか? 動画を扱うサイトを構築した経験のある方がいましたらアドバイスを頂けないでしょうか。
文字列の後ろから文字検索する方法は ないのかな? 今は、LOCATE(ch,REVERSE(str))とか してるんだけど、なんか残念。
データ型で tinyintやintを指定できますが、tinyintとintで同じ1から100までの数字を大量に入れたとき、処理速度はtinyintの方が速くなるのですか?
419 :
NAME IS NULL :2010/02/24(水) 01:28:52 ID:Efiuo6Iv
質問なんですが、1回のSql文で2つのテーブルへInsertする事は可能なんでしょうか? 1つ目のInsert文のauto_incrementの主キーのデータを2つ目のテーブルへInsertしたいんですが。
微妙にすれ違いでした。 質問スレへ行って来ます。
421 :
NAME IS NULL :2010/02/24(水) 19:24:32 ID:rlfwmQ2Y
サポート欲しい
mysql 5.1.42 WinXP テーブルを出力しようと思い、 select * into outfile 'c:\testdata.csv' fields terminated by ',' lines terminated by '\r\n' from ****; と入力すると 1 - Can't create/write to file 'c: estdata.csv' (Errcode: 22) とエラーになります。 多分 c:\tの \t をタブコードとかなんかと勘違いしているんじゃないかと思うのですけど、 ファイル名を変える以外の解決策ってありますか? (ファイル名を変えると出力はされるんですが)
'c:\\testdata.csv' じゃだめか
425 :
NAME IS NULL :2010/02/25(木) 18:33:45 ID:6g+MBBTt
id , namae , birthday という同じカラム構造を持つテーブルAとテーブルBがあるとします。 それで、テーブルAと同じデータをテーブルBにも持たせたいのですが、どうしたらいいでしょうか? 自分の考えではselect * from tAして、結果をテーブルBにinsertかなと思ったのですが、 いかにも原始的というか、もっと良い方法ないのかなと悩んでいます。 よかったら教えてください。 PHP5で実行できるやり方でお願いします。 また、上とは別ですが オートインクリメントのidを通常1,2,3…と増えていくところを 1001からスタートさせるにはどうしたらいいですか? 1001, 1002, 1003という形にしたいのですが。。 すみませんがアドバイスお願いします。 mysql5を使っています
auto_incrementのカラムに入る最初の値をテーブル作成時に指定できるけど、それはMyISAMのみ engine=MiISAM,auto_increment=100; みたいな形で
>>425 >1001からスタートさせるにはどうしたらいいですか?
1000までつくってから全部けしたら。
>>425 トリガ使ってみたかったのでちょっと試してみた。
mysql は 5.1.42
root[2ch]> create table `tA` (
-> `id` int(11) not null auto_increment,
-> `name` varchar(32) not null default 'nanashi',
-> `birthday` datetime not null,
-> primary key (`id`)
-> ) engine=InnoDB default charset=utf8;
root[2ch]> create table `tB` like `tA`;
root[2ch]> alter table tB auto_increment=1001;
root[2ch]> create trigger ins_tB1 after insert on tA
-> for each row
-> insert into tB (`name`, `birthday`) values (new.name, new.birthday)
これで、tA にinsert したら idが+1000されて tB にも入った。
>>426 v4.1系 innodb 利用時の auto_increment の制限事項(create tables時)に関して記述有り
http://dev.mysql.com/doc/refman/4.1/ja/innodb-restrictions.html v5.1系 innodb 利用時の auto_increment の制限事項(create tables時)に関して記述無し
http://dev.mysql.com/doc/refman/5.1/ja/innodb-restrictions.html だったので、試したら普通に使えた。
429 :
NAME IS NULL :2010/02/26(金) 16:18:32 ID:8QtDem/g
mysql5で変なエラー?が起きているんですが原因がわかりません。 相談させてください。 phpで $stt= $this->_dbConn->query("INSERT INTO `{$tableCopy}`(uId,loginId,name1) VALUES('20000','{$chkRs['loginId']}','{$chkRs['name1']}')"); としてuIdを指定して実行したところ、エラーの出力はされないものの select * from $tableの出力結果に該当データがみつかりません。 が、ターミナルから直接 insert into $table (uId,loginId,name1) values(0,'aaa','bbb') を実行したらそのデータは登録成功して、 しかも select * from $table で 20001, aaa, bbb という行が出てきました。(uIdはオートインクリメントの主キーです) どういうことでしょうか?さっきの登録されなかった20000が影響してるんでしょうか? 20000のデータ登録の直前のデータは15000だったので、本来なら(20000が登録失敗してるなら) 15001が出力されるはずだと思うんですが… なぜ20000のデータはselect * で出力されないんでしょうか? where uId = 20000つきのselectにも反応ありません。。 どうしてこんなことになるのか、、すみません、ご意見ください
430 :
429 :2010/02/26(金) 16:41:04 ID:8QtDem/g
自分なりの検証作業として $stt= $this->_dbConn->query("INSERT INTO `{$tableCopy}`(uId,loginId,name1) VALUES('20000','{$chkRs['loginId']}','{$chkRs['name1']}')"); の、INSERT先テーブルを別のテーブル(既存データなし、カラムはuId, loginId, name1のみ)に変更すると、 普通に登録できます(uId=20000として) 一方で、変更前のテーブルは上記の3カラム以外にもたくさんカラムはあるんですが、NULLでもOKのものばかりだし 何よりターミナルからの同じクエリ文がinsert成功してるんでカラム数の問題はないように思います。 (カラムのデータ型はどちらも同じです) …と、見ていて気が付いたんですが、成功したほうのテーブルはMyIsam型で、失敗したほうはInnoDBです 上記の処理はトランザクションの一部として動かしてるんですが、それが関係あるんでしょうか?
commitしてないってこと?
432 :
429 :2010/02/26(金) 17:17:41 ID:8QtDem/g
>>431 レスありがとうございます、全体の流れはこんな感じです
try{
//トランザクション開始
$this->_dbConn->beginTransaction();
$chkRs= $this->_dbConn->query("SELECT * `{$table}` WHERE --");//where以下省略
if(!$chkRs){
return "false_nodata";
}else{
//↓ここが今回の処理
$stt= $this->_dbConn->query("INSERT INTO `{$tableCopy}`(uId,loginId,name1)
VALUE('{$chkRs['uId']}','{$chkRs['loginId']}','{$chkRs['name1']}')");
//処理2
$this->_dbConn->query("UPDATE {$table} SET `role` = ? WHERE `preLoginPass`=? LIMIT 1", array($member,$tmpPass));
return "success";
}
}catch (Zend_Db_Statement_Exception $e){
$this->_dbConn->rollBack();
print($e->getMessage());
}catch (Exception $e){
print($e->getMessage());
}
これで、「今回の処理」部分のinsert登録ができていなくて(データに残ってない)
でも、その後にある「処理2」の部分はUPDATEできてる状況です。
(今回の処理のテーブルはInnoDB、処理2のテーブルはMyISAMです)
トランザクションに不慣れでいまいちよくわからないんですが、commitしてないってことでしょうか?
なんでデータ登録できてないテーブルへのターミナルからの別インサートが、無視されてる行の次の値から始まってるのかわかりません。
あと、念のため正直に言いますが、元はzendFWスレで聞いて解決しなかったのでこちらで質問させてもらってます。
あちらだとスレ違いになってきたので…。 よろしくです
433 :
429 :2010/02/26(金) 17:32:34 ID:8QtDem/g
あー、解決しました
>>431 さんのアドバイスどんぴしゃでした。
処理2の直後に$this->_db->commit();しなきゃいけなかったんですね。
トランザクションの知識不足で、処理2の実行がされてるのでトランザクション成功してるのかと思ってた
成功してたんじゃなくて、2用のテーブルがトランザクション非対応で不具合で実行されちゃってたんですね。。
ほんと助かりました。感謝します。ありがとうございます。
434 :
426 :2010/02/26(金) 20:35:05 ID:???
>>428 5.1でそういう事が出来るようになっていたのは知らんかった。 thx
制限事項に記述なし何て言わずに出来るようになったって書いて欲しいところだけど w
435 :
NAME IS NULL :2010/02/27(土) 01:49:19 ID:Gez8MG5C
MySQLへの画像保存について教えてください。 今、MySQLのBLOBに画像を入れ、それをphpで表示させようと考えてます。 HTMLフォームからphpでMysqlに入れているサンプルはよく見かけるのですが、 直接、SQL文のみでローカルに置かれている画像(jpgファイル)を入れる方法ってないのでしょうか? insert into table_name (img_data) values('ファイルのパス'); みたいな感じで入れられないのかな?とか思いましたが、これだとダメですよね。
values(load_file('c:\uporg349217.jpg'));
437 :
435 :2010/02/27(土) 14:41:02 ID:Gez8MG5C
>>436 なるほど!ありがとうございました!
m(_ _)m
インデックスについて質問です。 テーブルの特定のカラム上にない値をWHEREで指定してSELECTする場合なのですが、 EXPLAIN文を見ると、キーを使わずに検索しています。 例えば SELECT hash FROM users WHERE hash = '39fdb309ffb5e207' というSELECT文で、この値がテーブルのカラム上に存在する時は、 EXPLAINのpossible_keys、key ともに、hashカラムのインデックスの名前が出ます。 ところが、実際は存在しない適当な値(例えば'hoge')を検索しても、possible_keys、key は NULL でした。 存在する値で無い限り、インデックスは使用されないのでしょうか? また、テーブルの規模が巨大化した場合、これは重い処理となってしまうのでしょうか。 どなたかよろしくお願いします。
my.cnfについて質問なのですが データベースの文字コードがおかしい(utf8にしたいけどlatin1)うえ、 my.cnfが見当たらなかった(短縮コードなども考慮して探したけどなかった) ので自分でテキストエディタを使ってあたらしく作ったのですが、 内容を [mysqld] default-character-set=utf8 skip-character-set-client-handshake (my.cnfの場所はxampp/mysql/bin の中) にしてmysqlを再起動、新しいテーブルを作ってみても 使用している文字コードがutf8に統一されません。 たぶんmy.cnfの設定が間違っていると思うのですが、 どのように修正したらいでしょうか。 もしご存じでしたら教えてください。お願いします。
OS等の環境も書かねばバージョンも書かぬとな?
>>439 設定変えたら
drop database xxx;
create database xxx;
create table yyy;
をやり直す。
2つのテーブルがあります。 双方のテーブルのname, creator, sizeに同時にLIKEしたいのですがどうすればよいのでしょうか? 双方のテーブルに同一のデータは入っていないため、join on conditionできません。 主キーのhashとpathに関連性はありません。 old hash | name | creator | size new path | name | creator | size
443 :
NAME IS NULL :2010/03/03(水) 21:52:35 ID:PLsr1NeP
テーブルの特定のカラムを、そのテーブルがUPDATEされる度に アップデート時の日時が記入されるようにしたいです。 ALTER TABLE `spot_kihon` CHANGE `day_shusei` `day_shusei` DATETIME NOT NULL DEFAULT 'CURRENT_TIMESTAMP' 上記のようなクエリを書いてみたんですがエラーになります。どこがおかしいのでしょうか? MYsql5を使っています。 あと、ワガママですみませんがphpのupdate文だとどうなるのかな。教えてください。
>>443 datetimeじゃなく、timestampにすりゃいいじゃん。
俺なんか、あれに現在日時が書き込まれるのはINSERT時だけと思い込んでて、
UPDATEの日時に書き換わっちゃって泣いた経験があるんだぞ。
ああどうせ、マニュアルもロクに読まなかったアホだよ。
>>445 おおー、あっさり解決した。
ありがとうございます。助かりました。
後一つだけ聞きたいんですが、updateの時にlimitをかけるのっておかしいことなんでしょうか?
update 略 where hoge=1 limit 1 みたいな。
今まで意識せずにそうして来たんですが、意味ないような、でもしないとパフォーマンス悪くなりそうな。。
どうも気になっています。
>>443 update tablehogehoge
set 〜 = 〜,
〜 = sysdate() ←アップデート時の日時;
とかは?
>>444 MERGE使わない方向でお願いします。。
テーブルを新規に増やすことができないです。
>>446 WHEREにマッチしたレコード全部を更新したいなら、LIMIT付けるのは無意味だと思うよ。
マッチしたレコードのうち一部を更新したいなら、LIMITを付けることもあるだろうけど、
その場合ORDER BYも併せて使わないと、どのレコードが実際に更新されるか分からない
んじゃないかな。
まあ、WHEREだけできっちり限定できるようにする/出来る場合ばかりだったけど、俺の場合。
>>446 >>450 にある通り、処理結果が不定になるので
レプリケーションのマスタでそんなSQL流したら俺がグーで殴りに行くけどな
じゃあ、俺はチョキで目潰しを。
おいどんはパーで張り手でごわす。 >処理結果が不定になるので え、update結果がバイナリログで 伝わるんじゃないの? クエリだけが伝わって、実行内容は 不定なの?
454 :
NAME IS NULL :2010/03/04(木) 21:06:13 ID:ZrhgRcIJ
すみません、ド素人質問許してください phpMyAdminつかってて、カラムの設定を defaultでNULLに設定してると 1)レコード一覧で空きカラムにはNULLって表示がされます。 この状態と、 2)$param = ""; をinsertやupdate処理した状態(phpMyAdminではカラムが空欄になってる) また、 3)$param = NULL; を送信した状態(phpMyAdminではカラムがNULLと表示されてる) この3つはどう違うんですか? というのは、送信するパラメータがカラの時はNULLって言葉に置き換えてinsertなりupdateなり しなきゃいけないと思って今まで if($_POST['param'] != ''){ $param = $_POST['param']; }else{ $param = NULL; } とかやって来たんですが、意味あるのかな?と疑問に思えて来ました (送るパラメータが50個とかになると行数凄いことになるんだもん) mysqlは5です
>>453 binlog-format が statment(ステートメントベース)なら query が、
row(レコードベース)なら結果が入ると思う。
mixed の場合どのように判断されるかは試していない。
ステートメントベースの場合は error_log に次のような warningが出る。
Statement may not be safe to log in statement format. Statement: query...
ちなみに、
* ver 5.1.12〜5.1.28 までは default mixed
* それ以外は、default statement
5.1.29 で 5.0系との互換性のために戻されてます。
row(レコードベース)は 5.1.5以降で実装。
row は安全だが、binlog にすべて書かれるのでレプリケーションの遅れや
マスター側の書き込み量の増大などが考えられるのでオススメしない。
binary型がいまいちよくわかりません binaryというだけあって画像なんかのデータを入れるのに使うのかなとは思ったのですが こちらはblobを使うようなので char型のを全てbinary型にしても問題はないですよね? 両者にどんなメリットデメリットがあるのでしょうか?
>>457 ちょっと違うかもしれないけど、自分はperlのutf8フラグ あり/なし
みたいなものと捉えてる。
例えばchar(10)としたカラムがあった場合、
UTF8では30バイト、binaryでは10バイトの領域を占有する。
で、UTF8の場合はUTF8文字で10文字分格納出来るわけだけど、
binaryの場合は10バイト(UTF8文字で3文字)までしか格納できない、
とかの違いがある。あと、照合順予やエスケープ、ソートの結果とかが異なる。
メリットとは言えないかもだけど、ウチの場合、かつて4.0系から5.0系にupした時に、
一時的に文字コード絡みの各種不具合(ってか仕様)を回避するために使ったことはある。
charset=binaryにしておけば、server/clientの文字セット指定に関らず無変換なので・・。
あと、あんまり用途はなさそうだけど、同じテーブルの同じカラムに異なる文字コードの
テキストを入れたい時になんかにも利用できる。
>>458 詳しい解説ありがとうございます
utfの例はわかりやすかったです
その例だとcharのほうが文字コード考えないでプログラムできるのでよさそうですね
照合順序、エスケープ、ソートこちらもこれから調べてみます。
基本的にあまり多用するようなものではないんですかね?
webプログラムなんかのコードを見るとあまり使ってる例はみないので
1度だけbinaryとvarbinaryを多用してるテーブル定義を見たことがありましたが
結局は設計者次第なんですかね
460 :
NAME IS NULL :2010/03/07(日) 01:55:59 ID:dMuzjhdD
テーブルhogeTable(カラムは id, txt, photoName)があります。 これで、 id はオートインクリメント txt は文章(text型) photoName はpic1(pic+hogeTable.id)って形にしたいです。 説明しづらいんですけど、 データのinsert時にセットされるidの値を 文字列「pic」のあとにくっつけて、自動的にphotoNameカラムに入れていきたいんです。 どうしたら良いんでしょうか? 今のところ、いったんphotoName以外をinsertして、 last_insert_id()でid値を取得してそれを元にpicNを作って再度insertしてます。 自動化することはできないですか?
導出によって求められる項目を弾くのは第一正規化の基本
>>460 photoNameにIDつける必要あるんでしょうか?
データー取得時にIDをくっつけたらいいのでは?
レンタルサーバー(Xrea)がMySQLをサポートしています。 このデータベースに #ファイル名, 説明文 001.jpg, お花の写真 002.jpg, 車の写真 003.jpg, 電車の写真 ・ ・ ・ といったリストを一度に渡したいと思っています。 レンタルサーバーなのでMySQLの設定を変更したり自由に扱うことはできません。 こういった環境下でリスト一式をMySQLにアップロードするにはどうしたらいいでしょうか?
>>463 インサート文を書いて、mysqlに送信するといいよ。
>>463 ファイルをわたすという話ではないのであれば、
普通にExcelとかでINSERT文を作るのが一番早いかと。
>>464 >>465 > INSERT文
ありがとうございます。
ところでinsterしてアップロードした後に
001.jpg, お花の写真
002.jpg, 自動車の写真 ←
003.jpg, 電車の写真
途中の項目を変更した場合はどうしたら変更した分だけを更新することができますか?
同じinsert文つかって丸ごとアップすれば変更した箇所も含めて更新されますか?
>>466 更新したけりゃ Update
Insert でやるなら
on duplicate key update オプションつけて
>>467 今ふと疑問に思いました・・・
レンタルサーバーでinsertコマンドやupdateコマンドはどう打ち込んだらいいんでしょうか・・・
今こそ優しさが試されるとき。
>>468 Xreaならphpmyadminが使えるからそれで。
・・・というか、その知識と検索能力のなさで、MySQLで何をするつもりなのかが気になる。
>>470 写真を掲載するサイトを作ろうと思いまして・・・
写真とその写真に関する説明文をセットでデータベースに登録しようと思っています。
でもデータベース難しそうですね('A`;)・・・ 私のやろうとしてること程度でしたらデータベースなんて使わずに ローカルにファイル名と説明文をセットにしたテキストファイルを 用意してそれをPHPとかから読むようにしたほうがいいかもしれませんね・・・
PHPでMySQLからデータを読み込むアプリを作れるのであれば、 先にファイル名と説明文を登録・更新するアプリを作ってから、 表示用のアプリを作る方が、イメージをつかみやすいと思う
>>473 ・アップロード
・更新
・表示
この3つを全てPHPで作ると言うことですね。
そゆうこと。 アップロードとかサンプル見ながらやれば割と簡単にできる。 少なくとも、直接SQLを発行して管理をするくらいなら、 自分で言っていたようにDBよりテキストファイルを使う方が賢い
>>475 了解しました(・∀・)
> 自分で言っていたようにDBよりテキストファイルを使う方が賢い
やっぱりそうですよね('A` )・・・
更新したときもデータベースに修正しなおす必要もありませんし・・・
indexについて質問なんですけど、 insertやdeleteをするとindexの再構成が発生するのは当たり前として、 indexに絡まないカラムのupdateをした場合には indexの再構成は発生しないで済みますか?
一度作った行って削除しないのが普通ですか? AUTO_INCREMENTでIDを挿入している場合 削除したらそこの部分だけポッカリ空いてしまいますよね? 現在の最終IDが100だとしてID2の行を消した後に 次に作成される行のIDが2になれば埋まりますが101になるので IDを表示した場合歯抜けみたいでマヌケになってしまいます 削除フラグなんかをつけて表面上は削除したように見せかけてデータだけ残すなんて手もありますが 不必要な情報や個人情報なんかをユーザーが削除後も残しておくのはどうかと思うのですが 皆さんはAUTO_INCREMENTでID振ってる場合どうしますか? 削除してIDが抜けても気になりませんか?
>>481 IDが抜けてなにを気にすることがあるの?
別に1ずつ増加じゃなくて、重複しないようにランダムで振られたっていいというのに。
IDというのは単に「その行を識別するための何か」であって
必ずしも数値である必要は本来無いもの。
ただ単に、扱いやすいから数値を使っていて、
ただ単に、扱いやすいから1ずつ増加にしているだけだよ。
もし「登録順にソートしたい」なんてシステム用件があるのなら
それはそれで「登録日」とか「登録順」といった別カラムを用意すべきだし。
483 :
481 :2010/03/09(火) 02:58:43 ID:???
>>482 わかってはいるんですけど何か気になるんですよね
私みたいに気にする人はいないってことなんですかね
気にしないようにしたいと思います
>>483 >>482 の言う通り、ユニークとするものだから、
必ず連番にしたいのなら、自分で空き番取る処理を入れればいいだけだよ。
気にする、しないじゃなくて、必要があればするだけ。
IDの使い回しなんかすると、いらんバグを作り込むだけだから やめていおいた方が良いよ。 他人のデータが表示されたりとか。
それにしても auto_incrementに関して、抜けがどうのこうのという質問は多いな (という俺も以前質問したことがあったけど w
>>481 >一度作った行って削除しないのが普通ですか?
ふつ〜かどうかは知らんが、まあDELETEはインデックスの再編成を伴うから
比較的重い処理ではある。
ポスグレやInterbaseならDELETEでもUPDATEでも、この点同じだから気にしてもしょうがないけど。
並んだ数字に抜けがあると気持ち悪いのは良く判る んが、残すかどうかとは関係無いのう
初心者が大抵通る道だなw 後で考えるとなんてバカなことを気にしてたんだろうと思うけど
LIKEの範囲をid(主キー)が1,5,7の場合という風に限定したいのですが、 どのように書けばいいでしょうか? select * from db where foo LIKE'%test%' ... id =????
普通にAND条件ではいけないの?
質問がわからんけど select * from db where foo LIKE '%test%' and id in (1,3,5) とか、そいうことをやりたいんだろうか? まさかそんなことを聞いてるわけじゃないか。
正規表現で 互換性とかで使いたくなければ、文字列処理関数の組み合わせかなあ
さくらインターネットを使っているのですが、 ↓たまにこんなエラーが出て、一度出ると1時間以上なにも出来なくなります。 何か解決方法とかはありますか? I cannot connect to the database because: User ********* already has more than 'max_user_connections' active connections
>>494 コネクションが生きっぱなしなんだろ。
時間がかかる処理をたくさん並列動作させてしまってないか?
>>495 全てしっかり MySQL Closeしてます。
さくらの共有鯖って本当に終わってます。
>>494 接続が persistent になってんじゃないの?
>>497 mysql_connect を使用しているので persistent では無いはずです。
他の人のプロセスが食っちゃってるんじゃね?
>>499 やっぱそうでよね。今つかってるプレミアで他のユーザ数を調べたらそれでも60とかいましたし。
501 :
NAME IS NULL :2010/03/15(月) 14:38:34 ID:4OtXUcU9
ちょっと勉強中の質問というか疑問なんですが、MySQLとかの中で データベースを複数に分ける意味や効果って何かあるんですか? 単に何かの分類するときに都合がいいだけ? データベースの切り替えや指定が面倒なんで、つい 関連性の低いテーブルでも一つのデータベースの中で収めてしまいます。
502 :
NAME IS NULL :2010/03/15(月) 15:00:23 ID:eRqJqjFb
すんません教えて下さい。 MySQLが入ってるPCはXPで 他のPC(XP)からDBにアクセスする分には問題ないのですが 他のPCでWindows7からだと読み書きがアホほど遅くなってしまうのですが これの対処法を教えてください。。
共有フォルダとかは遅くないの? 名前解決あたりはどうやってる?
504 :
NAME IS NULL :2010/03/15(月) 16:24:39 ID:eRqJqjFb
エクスプローラとかで共有フォルダを見ても特に遅い事はないですが・・・ すんません、名前解決とかはどういうことですか? どこかで設定するアレですか?
506 :
NAME IS NULL :2010/03/15(月) 17:04:22 ID:eRqJqjFb
>>505 ごめんなさいすんません。
hostsとはどこにありますか。。。
ぬおおおお、hostsの場所はOSに寄るし、さすがにスレ違いだぜ。 UNIXなら/ets/hosts
winなら %systemroot%\system32\drivers\etc このレベルでサーバーの管理してんの?
あ、タイプミス。 /etc/hosts
510 :
NAME IS NULL :2010/03/15(月) 17:13:57 ID:eRqJqjFb
>>507 すんませんすんません僕は死んだ方がいいのはわかっていますが
無知なこのブタに教えてください。
OSはWinXPなのですが、MySQLをインスコしたフォルダの何処かを辿れば
hostsフォルダ?ファイル?があるのでしょうか?
ちなみにこれってhostsって拡張子無しのファイル名なんですかね?
511 :
NAME IS NULL :2010/03/15(月) 17:16:26 ID:eRqJqjFb
とりあえずsystem32\drivers\etcにあるのを確認しまくりました。 んで、この中をチラ見してみると、 127.0.0.1 localhost とかいていましたが、これにIPだけ追加すればいいのでしょうか?
いやまあ共有フォルダで問題ないならそれじゃない気がするけど、 ちゃんとそれが原因じゃないことを確かめるためにも入れてみたほうがいいね 1行に IPアドレス サーバ名 で入れればいいよ。 拡張子無しだから気をつけて
513 :
NAME IS NULL :2010/03/15(月) 17:31:08 ID:eRqJqjFb
>>512 ありがとうございます。
このブタにここまで優しくお答えして頂いて感謝です。
IPとサーバ名を入れてやってみます。
ちなみに、アクセスはできてます。
QueryBrowserとかからもDBを見ると1〜2秒かかってしまいます。
さらにちなみに言うと、正常なXPと異常な7は同じPC(デュアルブート)です。
故にIPも同じです。
ちょっとうんこしたくなりました。
>故にIPも同じです。 意味不明 サーバのIPアドレスだぞ
あと、アホほど遅くなると書いてたから名前解決を疑ったが 1〜2秒なのかよ。それだと名前じゃないと思う、状況は正確に書いてくれ
516 :
NAME IS NULL :2010/03/15(月) 17:48:21 ID:eRqJqjFb
>>514 ああ、サーバですか。
MySQLが入ってるPCってことですね?
すんませんでした。
>>515 いやReadで2秒とかアホすぎます。
XPから読むだけなら数百msでぼっとん便所の如くお釣がきますので・・・
ちなみに書き込みは10秒くらいはかかってました。
再度状況を説明しますと、
サーバ:XP クライアント:XP/7のデュアルブート ってことかな? ここで仮に サーバ(server1):192.168.1.1 クライアント(client1):192.168.1.2 だとすると、クライアントのhostsファイルに 192.168.1.1 server1 って書け、ってことだよ。 ま、どのみち遅いのはこれに関係ないと思うけど。
518 :
NAME IS NULL :2010/03/15(月) 17:51:34 ID:eRqJqjFb
MySQLがインスコされているPCはXPで 他のPC(XP)からだと普通の速度で読み書きができます。 他のPC(Win7)からだとアクセスが極端に遅くなります。 この他のPCは、XPと7は同じPCでデュアルブート あと好きなお菓子はえべせんです。
519 :
NAME IS NULL :2010/03/15(月) 17:54:06 ID:eRqJqjFb
>>517 あ、レス遅れて代弁ありがとうございます。
実にその通りで、hostsに書き方も把握しました。
ちなみに皆さんWin7からでもアクセス速度は特に問題ないみたいですが
これはMySQLではなくて別のOS絡みのアレなのでしょうか?
7で使ってないからわからんけど、Windowsファイアウォール切ってみるとか QueryBrowserを互換モードで動作させてみるとかそういうのからやってみたら?
SELECT CURRENT_DATE とかやって時刻は発行時と返事が帰ってきたときと どっちに近い?あとアクセスログ出すといいかも
CURRENT_TIMESTAMPか、まあその辺は調べて
523 :
NAME IS NULL :2010/03/15(月) 18:17:35 ID:eRqJqjFb
>>520 とりあえずFWは全て無効にしております。
それと自ソフト(MySQLにアクセスしてる)は互換モードで行っております。
>>521-522 纏めて失礼します。
SQLを発行する前後で時間を計測した結果が
XPでは100msくらいで、7だと10秒くらいでした。
ちなみにXPでコンパイルしてXPと7で同じソフトを使って計測しましたが。
すんませんログとかアレしてみます。
なんかこれ7固有の問題っぽい気がするのですが、
ちなみに、これとは全く関係がないのですが、
僕(ブタ)が作ったソフトでXPでは普通に動作してても7だと正常に動作してくれません。
Win7ってほんとうんこですね。
クライアントのOSのせいにするんならここはスレ違い まあ自分のプログラムが悪くてもスレ違いか プログラマのクセにVista飛ばすからこういうとこでひっかかるw
確認するけど、君の作ったソフトじゃなくても、例えばQueryBrowserから でも7からだと遅いんだよね? で、サーバへのpingの応答速度は普通なんだよね?
526 :
NAME IS NULL :2010/03/15(月) 18:44:31 ID:eRqJqjFb
>>524 いや最初はMySQL側で何か設定というか対応策があるのかとおもったんですよ。
ちなみにソフト的な7での不具合は多数ありますので(だから7対応どーたらとかある)
ちなみにビスタは世間的に糞認識されてたからそんな出回ってないですよ。
今思えばスレチだったかもしれませんが、Win7でそういう報告があったらアレかとおもいまして
>>525 鬼のようにはいです。
QueryBrowserからでもアホほど遅くなっています。
はいそして、ping応答速度は至って普通です。
これって僕が死ぬべきなんですかね?
好きなアイスはMoです。
>>526 そんなに簡単に死んだら親が悲しむんじゃない?
俺はどうでもいいけどさ。
掲示板の投稿時間を管理したいときって UNIX値で入れる以外にオススメってあります?
529 :
NAME IS NULL :2010/03/16(火) 10:30:23 ID:k595kZow
MySQL(Tritonn)からSenna+MeCabをWindows環境で使いたいのですが、 Tritonnの公式サイトには >2008/12/29 Tritonn 1.0.12リリース >Tritonn 1.0.12をリリースしましたのでお知らせさせていただきます。 >※Windows版ではmecab未対応のためN-Gramのみとなります。 と記載されており、それ以降のバージョンに関しては特に記載がありません。 最新バージョンのTritonnではWindows版はMeCabに対応していますか?
管理をもっと具体的に 日付型だと年や月でフィルターするのがちょっと楽
531 :
NAME IS NULL :2010/03/16(火) 11:44:18 ID:UU7cr7Yr
mysql.com繋がらないのだが。
mysql.oracle.comとかじゃね?
つながるけどちと重いな
534 :
NAME IS NULL :2010/03/16(火) 15:46:42 ID:JBH677pX
正規化について教えてください よく、賃貸物件サイト見てると検索のこだわり条件を指定するときに 「2階以上」「エアコンつき」「バストイレ別」とかをチェックボックスで選ぶのありますよね? ああいうのは物件データ側からすると物件名や管理会社名や所在地を入れた基本情報テーブルと 上記のようなこだわり条件を入れた「こだわり条件テーブル」に分けて登録してるんでしょうか? たぶんそうかな、と思ってるんですが、、 ここで質問です 基本情報テーブルに「こだわり条件カラム」を作って「1,3,7,12」みたいにチェックボックス値を CSV形式で入れていってはいけないんですか? 正規化っていうルールをあえて破ることになると思いますが、それで受けるデメリットや 逆にそうしたほうが得(もしくは大してデメリットにならない)になる場合ってどんなときでしょうか?
やってみたら? 検索とかどうするつもりよ
>>534 実装上はどっちでもいいし、正規化なんて教科書上のルールなんで
わかってやるならやぶっても問題ない。わからないんなら教科書
通りにやった方があとで困らない。
ちなみに
その例を正規化すると最低3テーブル必要なのはわかってるよね?
フィールドにCSVで入れるのはいいけど、それをあとでWHEREで条件
絞って取り出す時はどうするの? とかそういう問題を簡単にクリア
できるかどうか。まあSQL一発でできなけりゃプログラム側でいくら
でもできる話なんで好きにしたらいいんだけどね。
537 :
534 :2010/03/16(火) 16:15:48 ID:???
>>535 ,536
回答ありがとうございます
そうですね、csvだと抽出が面倒ですね
というか、すみません、恥ずかしいのですがどうして3テーブル必要なのかわからないです
良かったら教えてもらえませんか?
基本テーブルと、こだわり条件テーブルと、、?
SELECT * FROM t_kihon LEFT JOIN t_kodawari ON t_kihon.id = t_kodawari.kId
WHERE t_kodawari.val = {$val1} OR t_kodawari.val={$val2}
(t_kodawariにはkIdとして基本テーブルのIDを入れて、チェックボックスの要素分だけループでINSERTする構成)
こんな感じでどうにかなると思ってましたがぜんぜん駄目でしょうか…
独学で複雑なDBの設計とかしたことないのでわからないです。よろしくお願いします。
>>537 t_kodawariにはどういうデータが入っているの?
[t_kihon]
1,物件1
2,物件2
[t_kodawari]
1,1,2階以上
2,1,エアコンつき
3,1,バストイレ別
4,2,2階以上
5,2,エアコンつき
6,2,バストイレ別
こんな感じ? これだと正規化が完了していないんだよ。
まあ若干スレ違いだけど。
まあ基本は1個所に複数のデータを入れない、 同じデータを複数個所に置かない、からかな
540 :
534 :2010/03/16(火) 19:10:28 ID:???
>>538 どうもありがとうございます
説明不足ですみません、書いてもらったとおりのテーブル構成です。
それで正規化が終わってないとは思いませんでした
あとどうしたらいいんでしょうか? 今まで読んだPHPやMysqlの本では
それで十分になってたと思うんですが
「エアコンつき」を「エアコン付き」に変更したいとき、かなりの数のupdateが発生するな
542 :
534 :2010/03/16(火) 20:11:58 ID:???
>>541 なるほど、そういうことですか
じゃあ、実際は数値で入れることにして値の表示は別テーブルに持たせるか
.txtなりのファイルで管理します
ありがとうございました、ほんと助かりました
>>542 つか、SET型を使えよ。
表示なんかアプリケーション側で
好きなようにしたらいい。
544 :
534 :2010/03/16(火) 20:54:22 ID:???
>>543 どうもありがとうございます。SET型、今はじめて知りました
これはすごいですね、SET型を指定したカラムには、あらかじめ64個まで入る値を予約できて、
その値に限りCSV的にINSERTできて、しかもFIELD_IN_SET()でサクサク一発検索できるんですよね?
こういうの知ってるのと知らないのじゃ大違いというか、あーあ、なんで知らなかったんだろう
やり終わったあとにこういう形で知るしかないから大変だなー
SET型とENUM型の違いについて教えてください。まだ使ったことがないのですけど、参考書をチラ見した限りでは なんか似たよ〜な感じですけど、ちがうって事はなんか使い方に差があるんですよね?
リレーショナルにする理由ってないよな。
正規化すれば、それぞれはシーケンシャルにアクセスできるから実装的に有利ってのはあるよ 理論とかは知らないけど
>>544 なんにせよきちんと正規化できるようになってからだよ、そういう応用編は。
>>545 SETは複数。内部はビット演算。
ENUMは単数。内部は整数。
参考書はもっとちゃんと読め。
もし書いてなければ捨てろ。
公式リファレンスをオススメ。
550 :
NAME IS NULL :2010/03/17(水) 17:34:03 ID:3sVku1gK
PerlでDBIを使用しMySQLに接続しているのですが、 select結果の行数を得る方法はないものでしょうか。 delete等の結果行数はrowsでとれるのですが、Pg モジュールのntuplesと同義のものがあればどうか ご教示ください。
DBIならCOUNT(*)使うのが正道なんじゃないのかなぁ
>>551 countのために2回SQLを発行することにより、コストがかかると
判断したため質問させていただいたのですが、やはりcountしか
ないですかね。。
ご返答有難うございました。
countのために別SQL発行することででコストがかかると思う人は多いけど 件数によってはselectで最終行までフェッチする方がよほど負荷がかかるので 結果的にはcountの方が軽いことが多い。
>>553 なるほど。そうなんですね。
一つ勉強になりました。
固定概念は怖いですね。
有難うございました。
>>550 何を見て、ないと言っているのか。
$sth->rows
>>553 いみふめ。
SELECT結果が不要だったらそうだけど、
そういう話ではないような。
>>555 $sth->rowsはupdateやdelete等を行って処理した数を
返すものです。
ようは、一度selectして結果を取得するついでに件
数も取得できないものかと質問させていただいた
次第です。
ID | DATA ----------- 1 aaaa 2 aaaa 3 bbbb 4 aaaa とあったときに DATAカラムで一番多いデータから取るにはどうすればいいでしょうか? 多い順にランキングにしたいのです
>>555 A)
SELECT * FROM TABLE1をやって全件フェッチして件数を知る。
B)
SELECT COUNT(*) FROM TABLE1
SELECT * FROM TABLE1
の2回のSQLを発行する
ではB)の方がいいよ、という話をしているのです。
>>554 ついでに言うとCOUNT(*)よりもCOUNT(主キー)の方がいいかも。
>>558 B)の2回目の結果は取得しないのかい?だったら何のために発行するの?
560 :
NAME IS NULL :2010/03/17(水) 22:52:48 ID:t4oaZidF
複数のサイト(DB)のデータを効率的に一気に操作する方法が知りたいです。 たとえば、美容院をまとめたサイトAと床屋をまとめたサイトBがあって サイトBでサイトAのデータベースAの中のデータを利用したいと思います。 (例:東京都内の美容院と床屋をまとめて検索かけるなど) どうしたら良いんでしょうか? 1)データベースは別々にせず、一つにまとめる →1-a)サイトAのデータベースにサイトB用のデータもまとめて入れる →1-b)A,Bとは別にデータベース用のサイト(サーバ)を作る 2)サイトAのデータ、サイトBのデータを別々にSELECTしてくっつける 3)サイトAのデータをサイトBのデータベースに定期的にコピーする 4)その他 どれがいいでしょうか? 1)なら、1-a, 1-bのどちらでも、SSLのコストが半分ですむのかなと思います デメリットはわかりません 2)クエリか二倍かかってしまう、SELECTの結果をくっつける方法自分にはわかりません 3)一番現実的? 定期的にコピーする方法がわかりません ※二つのサイトは一つのサイトでバーチャルドメインで運用予定です すごい素人考えですが、どんなやり方がいいでしょうか? それぞれの駄目な点など指摘もらえたり、 その他(4)として、別な案をいただけるとすごく助かります。よろしくお願いします。 (Mysqlに限った問題の質問じゃないかもしれないですが、Mysqlの利用を考えてるので こちらで質問しました)
>>559 えーと、実装というかアプリの仕様によるけどさ
たとえばGoogleの検索結果みたいなことをやりたいとして
トータル1万件中先頭の10件を表示してますと。
そこで、検索時点で何件かわからないので全件フェッチ
しましたなんてアフォな実装しないでしょ?
トータル件数を知りたいのは大抵フェッチ前で
最終行に行った後にはむしろどうでもいい情報じゃん?
そういうことをやりたいって話じゃないの?
┐(´ー`)┌
勉強用に掲示板を作っているのですが、NGワードを格納しているテーブルがあったとします。 TB_NG_WORD _____________________ NUM WORD 1 A 2 B 3 C そして、本文に 私の名前は「B」と申します。 という書き込みがされた場合に、テーブル内に含まれるNGワードが本文に含まれているかどうかの判定を 出来るだけスマート(速く)に行うにはどうすれば良いでしょうか? 現在は、 SELECT WORD FROM TB_NG_WORD を実行した結果をPHP側で配列に格納し その配列の中の要素でループしながら 本文にNGワードが含まれているかを判定 しているのですが、NGワードが増えると時間が掛かりそうです。 スマートな判定方法をお教え下さい。
>>557 COUNT(*),DATA FROM なんたらGROUP BY DATA
>>563 NGワードをテーブルじゃなくて|区切りのファイルにしてマッチングとか。
566 :
557 :2010/03/18(木) 00:19:57 ID:???
>>563 データベースあんまり関係ないな。
本文に対する判定は登録された1回だけでいいんだろ?
#あるいはNGワードが更新された場合も必要か
NGワード群を(A|B|C)という正規表現とみなしてあらかじめ
DFAを用意しておき、本文が登録されるごとにマッチングを
行うというのが一般的な方法を用いる中では最速に近いはず。
>>550-558 あたり
ちゃんと公式(MySQL)のdocument読んでる?
っつても質問でサーバのバージョン書いてないから100%使えるとは言えないけど、例えば、
SELECT * SQL_CALC_FOUND_ROWS FROM `table` limit 10;
ってクエリを投げて、検索にマッチするのが10件以上の場合、続けて、
SELECT FOUND_ROWS();
をかければ、一回目のクエリでの合計ヒット件数が取得できる。
確かに、これも厳密に言えば二回DBにクエリを投げてることにはなるんだけど、
一回目の結果を内部的(クライアントスレッドのメモリ上?)に保存しているので、
実質二回目はDBやテーブルを触らない。
Table_TypeがMyISAMで、SELECT * FROM `table`; (whereなし)の場合は、
テーブルが格納件数をテーブルデータとは別に持っているので十分に早いが、
whereやgroup by、order by なんかを多用した時は、件数を数えるだけでも
それ相応のコスト(時間)がかかる時もよくある。
ちなみに自分の確認しているのでは、4,1系でもこのOptionは利用可能。
それより古いバージョンは知らない・・。
>>560 特にデータを分離しなければならないわけでなければ、
1-a)一択だと思う。
テーブル構成の同期を保つのに気を使う必要もないし、
全く同一のアプリが全く同一の設定で使えるし。
570 :
555 :2010/03/18(木) 01:34:05 ID:???
>>556 >$sth->rowsはupdateやdelete等を行って処理した数を
>返すものです。
へえ、うちのPerl+DBIとは違うようだ。
>>568 >ちゃんと公式(MySQL)のdocument読んでる?
全読はしてないが、それなりには。
オレとしてはそんなことより、
>>550 の
どこを読んだら、limit節の話が出て
くるのかを聞きたい。
571 :
568 :2010/03/18(木) 01:46:59 ID:???
>>570 selectクエリで、$sth->rows で件数を取得できない、
ってなったら、あと考えられるのは limit 条項しかないと思うが・・。
自分的には
>>561 的なことがしたいじゃないかと思った。
> >$sth->rowsはupdateやdelete等を行って処理した数を
> >返すものです。
> へえ、うちのPerl+DBIとは違うようだ。
ココの部分についは、全く同意。
うん? ひょっとして
>>550 の知りたいのは、
$sth = $dbh->prepare('select うんたら〜〜');
$rows = $sth->execute();
これのことか??
>>574 それは$sth->rowsと同じだろ。
主キー(auto_incrementではない)をランダムに抽出する方法はありますか? 主キーは英数字です。
>>576 order by rand() してlimitで1件目取りだすとか
>>577 結局はドライバ次第ということか。
DBI自体はただのインターフェイスだし。
このスレ的には、DBD::mysqlが対応
してるんだったら、それでいいよな。w
でもまぁDB差し替えを検討することは十分あり得るとも思うけどね。
>>550 あるよ。PDOには用意されてるからPerlのライブらりんにもあるだろたぶん。
皆様色々と有難うございました。 私もマニュアルを鵜呑みしていたこともあるのですが、 countで対応しました。 今回のSQLがlimitなしのものであったため、同時に 件数も取れないかと思った形だったのですが、色々 とご意見いただきとても勉強になりました。 この場をお借りし御礼申し上げます。
>>584 SELECT SQL_CALC_FOUND_ROWS * FROM unko LIMIT 1;
SELECT FOUND_ROWS();
これやってみ。
カウンタ貸出サイト的な物を作ってるんですが 一人事に別々のテーブル作るってのはナンセンスですかね? 1アカウントで、複数のページのカウントをするので user_takasi ------------- url, カウント回数 url, カウント回数 url, カウント回数 url, カウント回数 こんな感じに使用と思ってるんですが それともみんなまとめて takasi, url, カウント回数 yosida, url, カウント回数 こうしたほうがよろしい?
当然後者
>>587 即レスありがとうございます
後者のほうで作ってみます
589 :
NAME IS NULL :2010/03/21(日) 14:46:45 ID:kqP9QkWY
利用規模にもよるけど前者では100ユーザいたら100テーブル 不特定の貸し出しサービスなら、下手したら千人単位になるでしょ 初歩的な仕様バグってやつ
MySQLの限界に挑戦!っす w
初心者がよくやる間抜け仕様ですね。 1年後くらいにこんな仕様を考えた自分を振り返ってみるといい
MySQLのユーザの皆様、突然MySQL+PHPで業務に耐えうるものをつくれといわれた、ただのWIN使いです 両方を学ぶのに良いサイト・本など教えていただけますでしょうか? Linux機もないし、レン鯖に直接乗せて勉強していくしかないので効率的にやらないと恐い気がしています。 とりあえず借りたところでテープルはつくっておきました。そんな程度の知識です。 テキストなんだかデータなんだかキャラクターなんだか、なにがなんだかさっぱりわかってません。 よろしくお願いします
594 :
NAME IS NULL :2010/03/21(日) 19:45:08 ID:MG9Sa6dU
ただでさえMySQL,PHP,JavaScript,HTMLを一気に学習させられるのに そのうえフレームワーク追加したらパンクしちゃわないか?
むしろ、素人に期間なく対応させるなら、 10分でできる〜で紹介されているCRUDだけのWebアプリができれば御の字でしょ。
>>592 手元のWin機に、Eclipse + PDT(もちろん、ApacheとPHPも)の環境を構築した方が
学習・開発・試験には便利だよ。
それで出来上がったらLinux環境に持っていくのも良し。
それをやるなら、XAMPPが入ってるPleades All in Oneで決まりでしょう。
んー、超初心者だけど、入り口でつっかかってまふ。 1.xamppは動いてる。 2.create databaseでデータベース作る。 3.create tabaleでテーブル作る。 ここまではおけ。 4.レコードを追加する。(insert into) 5.names set sjis;をやる 6.select *で中味を見る もじばけー。 「1」なんて「『」になっちゃってるし。 日本語入力したところは「??」がいっぱい。 同じ環境で、本の付録のサンプルDBはちゃんと日本語も見えるんだよなあ。 どこが悪い? どなたか教えてくだされ。
>5.names set sjis;をやる をコネクト直後に行う。 コネクト直後に行って、3からやり直してみよう。
>>599 ありがとー、ってやり直したけど同じだった。
phpmyadminで見たら照合順序が latin1_swedish_ci になってたけど、
これが原因?
どうやったら治せるんだろふ。(泣)
データベース作り直し
>>600 作り直した方が早い
いや、まあ、それなりの手順で作り直さなくても修正効くんだけど
説明するの面倒くさいし、タダじゃやってられないし、ね。
バージョン5.0で、クライアントとサーバーの それぞれの文字コードが何かを確認するには、 どうしたらよいのでしょうか?
show variables;
605 :
NAME IS NULL :2010/03/23(火) 09:48:46 ID:xo47nm8h
テーブルの種別で悩んでいます。 お助けくださいませ。 usersテーブル ・ID ・address ・hash と作りたいのですが、 hashの種別は varchar(255) でよいでしょうか?
使うHash関数が、何バイトの文字列を出力するのかを調べて、 その固定長でいいのでは。
経過書き込み。 phpmyadminでごちゃごちゃいじったら、なんかマシになってきた。 それにしても、なぜこんなつまづきやすいことを本に書かない。 技術評論社の、ばか。
DB構成表をプロデューサーの人に渡したところ、その人から、 「設計が完全に完了してからパフォーマンスを考慮して非正規化 をする事を考えるように」と構成表も見ずに言われたのですが、 ここで指す「非正規化」とは、何を指すのでしょうか? 会社に入ったばかりのものであるため、すみません、ここで質問 させてください。 お願いします。
それはMySQLじゃなくてSQLの一般常識だよ。 普通にググッた方がいい
いやすぐに本を買って読め。 それじゃあクビ切られるぞ。
ここは、なんて親切なインターネッツなんだろう。 ちょっと感動。
そのプロデューサーに聞けばいいんじゃねの? 中途採用?じゃぁ、がんばれw
>>610-613 まったくもっておっしゃるとおりですね。
返す言葉が見つかりません。
しっかりと勉強し、それでもわからないようであれば
頑張って聞いてみます。
ありがとうございました。
615 :
605 :2010/03/24(水) 07:28:56 ID:???
私書箱システムを考えているのですが、どういう風にテーブルを組めばいいかアドバイス頂けませんでしょうか。 今考えているのが id from_id to_id message created って形で 送信元を from_id 送信先を to_id として message にメッセージを入れます。 ただ、これだとどのメッセージにどのメッセージからの返信なのかというのが わからなくなってしまいますよね。 教えて下さい。よろしくお願いします。
要件が良くわからないけど、 先頭のidが、メッセージのidを示しているのであれば、 もう一項目追加して、返信先IDを保持するようにすればいいのでは。 id from_id to_id reply_to message created
メッセージとidと作成者、作成日時だけのテーブル作って どこへ送信したのかとかどのidのりプライなのかとかは 別テーブルにした方がいいんじゃ? 同報の仕組みとかはいらないのかな
>>617 >>618 ありがとうございます。
送信情報テーブル
id from_id to_id created
メッセージテーブル
id send_id message created
こんな感じで行ってみようと思います。
ありがとうございました!
slow.logに記録されているQuery_timeが5のSQL文を実際にmysqlに接続して投げると0.2くらい実行されます。 これはネットワークやプログラムとの接続部分がボトルネックになっているということでしょうか? long-query-time=4で設定しています。 ご教示お願いいたしますm(_ _)m
>>620 クエリの実行時間であって、結果をお渡しする時間ではないので
通信部分がボトルネックだった可能性はない。
AテーブルとBテーブルがあって、BはAに紐付いているとき Aのレコードを削除したら紐ついてたBのレコードも いっしょに削除されてほしいんだけど こういうのってなんとかナージャでやるんだっけ?
623 :
620 :2010/03/24(水) 16:14:06 ID:???
>>621 ありがとうございます。
つまり単純にクエリを実行した時間が遅かったってことでしょうか?
接続してまったく同じクエリを投げてもとても早いのですが、、
insert文なのでキャッシュされているということはないですし、slow.logがおかしいなんてことがあるのかわからないけどそれしか考え付かないです;;
624 :
620 :2010/03/24(水) 16:15:56 ID:???
ナージャとは、なんじゃ?
626 :
621 :2010/03/25(木) 17:03:24 ID:???
>>624 ありがとうございます。MyISAMなのであきらめます。
SHA1関数も、2010年問題によりあまり使いたくなくなってしまいました。 ハッシュを作る何かいい関数はありますでしょうか。 SHA2はまだ実装されていないみたいですので。。
アプリケーション側で実装するのが普通なんだが
すいません、教えて下さい。 accessとmysqlをmyodbcを利用して接続していますが、myodbcのバージョンが 3.5.1.05以外問題が発生するので、未だに変更できません。 しかし3.5.1.05は4.1以降のmysqlに接続出来ません。 そこで以下の方策のいずれかはとれるのでしょうか。 ・myodbc3.5.1.05で4.1以降のmysqlに接続する ・複数のmyodbcをインストールする ちなみに今までの経験上、3.5.1.05以外では一部文字化けがあったり、 date_format関数の結果がおかしくなったりします。3.5.1.27では、adoの レコードセットを開いて更新するとaccessが異常終了します。 よろしくお願いします。
>>631 ODBCを5.1にVerUpして使ってるけど、問題でてないなぁ。俺の環境では。
まぁ文字化けやdate_formatでちと難があったけれども、なんとかできた。
少なくとも異常終了みたいなことは発生していないよ
テーブルのうち空き番号があれば、その番号を取得し存在しない場合には、 テーブル内の最大番号+1を返すクエリはどうすれば良いでしょうか? 例) TEST_TABLE ID 1 2 3 この場合 → 4 を取得 ID 1 3 この場合 → 2 を取得
抜く時にAUTOINCREMENT値を変更しとけば?
>>634 ???
よくわからないのでSQLで一発で抽出する方法をお教え下さい。
>>633 SELECT
IF (MAX(SAB1.id) = hantei,MAX(SAB1.id)+1 ,MAX(hantei))
FROM
(SELECT
A.id,
MAX((SELECT COUNT(B.id) FROM test_1 B WHERE A.id >= B.id)) AS hantei
FROM test A
GROUP BY A.id ) AS SAB1
二個以上抜けがあったら、抜けの最小しかとれないけど
一応、例題には対応できるが・・・ひどいSQLだな・・・
間違えた SELECT IF (MAX(SAB1.id) = hantei,MAX(SAB1.id)+1 ,MAX(hantei)) FROM (SELECT A.id, MAX((SELECT COUNT(B.id) FROM test B WHERE A.id >= B.id)) AS hantei FROM test A GROUP BY A.id ) AS SAB1
MySQLは5.1xを使っているのですがトランザクション処理がうまくいきません。 SET AUTOCOMMIT = 0; BEGIN; DROP TABLE TEST; ROLLBACK; SET AUTOCOMMIT = 1; というSQLなのですが、DROPされてしまいます。 SET AUTOCOMMIT = 0; SHOW VARIABLES LIKE 'AUTOCOMMIT%'; としたところAUTOCOMMITはONのままです。 開始の手順がおかしいのかと思い、 PHPのPDOから専用のbeginTransaction() rollBack() 関数を使って実行しましたが結果は同じです。 借りているレンタルサーバでも同じ状況になることを確認したのですが、 SQLがおかしいのでしょうか? それとも何か設定が悪いのでしょうか? どなたかお助けお願いします。
DROPって暗黙のコミットではなかったっけ?
TRUNCATEもROLLBACKできないから、 DROPもROLLBACKできなくて不思議はないと思う。 他のクエリはちゃんとROLLBACK出来ているという前提であれば、 DROPはROLLBACKできないということであっていると思う。
そんなん当たり前やろ・・・。
DDLがROLLBACKできない … Oracle、MySQL DDLもROLLBACKできる … DB2、SQL Server、PostgreSQL 当たり前ではないのじゃよ
644 :
639 :2010/03/28(日) 15:15:48 ID:???
レス遅くなってすみません。 調べたところINSERT文でロールバックの説明をしているサイトがあったので、 おそらくINSERT文なら正常ならロールバックできると思い(あまりDB詳しくないので断定ですみません)、 DROPの代わりにINSERT文でやってみましたが結果は同じになりました。 PHPの話題はスレ違いになりますが一応コード出しときます。(エラー処理・例外処理などは省いてます) PHPのmysql関数を使ってやる場合 $m = mysql_connect("localhost", "username", "password"); mysql_select_db("TEST_TABLE"); mysql_query("SET AUTOCOMMIT = 0"); mysql_query("BEGIN"); mysql_query("INSERT INTO TEST (NAME) VALUES ('HOGE')"); mysql_query("ROLLBACK"); mysql_query("SET AUTOCOMMIT = 1"); mysql_close($m); PHPのPDOクラスを使った場合は、 $pdo = new PDO("mysql:dbname=TEST_TABLE;host=localhost;", "username", "password"); $pdo->beginTransaction(); $pdo->query("INSERT INTO TEST (NAME) VALUES ('HOGE')"); $pdo->rollBack(); $pdo = null; どちらともコミットされてHOGEが登録されてしまいます。 PHP側に問題があるのかDB側に問題があるのかわからないのですがPHPスレで聞いたほうがいいでしょうか?
コマンドラインかadminツールでやってみては
つーかMyIsamとか?
TESTテーブルをMyISAMで作ってるんだろうね InnoDBで作り直そう
648 :
639 :2010/03/28(日) 16:14:07 ID:???
>>645 phpMyAdminでは一向にOFFにならなかったのですが、
コマンドラインからだとSET AUTOCOMMIT = 0;のあとにちゃんとOFFになりました。
しかしその後立て続けにクエリを実行していったところ、
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO EXAMPLE (NAME) VALUES ('HOGE');
Query OK, 1 row affected (0.00 sec)
mysql> ROLLBACK;
Query OK, 0 rows affected, 1 warning (0.02 sec)
と、ロールバックのところでwarningが出てしまいました。
恥ずかしながらwarningの内容はどうやって出すのかわからないため出せません。
SELECTしてみたところやはりHOGEが反映されているようでした。
>>646 変数を確認したところstorage_engineはMyISAMとなってます。
649 :
639 :2010/03/28(日) 16:15:25 ID:???
>>647 どうもありがとうございます。
ストレージエンジンで色々変わるのですね。
早速作り方を調べて試してみたいと思います。
MySQLはトランザクションがない そんな風に考えていた時期が俺にもありました(AA略
show warnings; それから確認するのはサーバ変数ではなくて show create table EXAMPLE; の結果
652 :
639 :2010/03/28(日) 16:41:25 ID:???
ALTER TABLE EXAMPLE ENGINE=InnoDB
としたところうまくいきました!
>>651 EXAMPLEに対してはInnoDB、サーバ変数はMyISAMのままなのを確認しました。
show warningsも見ることができました。
大変勉強になります。どうもありがとうございます。
本当どうもありがとうございました。
jikoku は TIME型、 今日の日付とデータベースの時刻から日時を作り出したいんだけど SELECT ADDTIME( CURDATE(), jikoku ) FROM unko; ってやったら 0000-00-00 00:00:00 になっちゃう。なんでだ?
データを保持してるテーブルに対して、カラム名を変更したり型を変えると中身のデータはどうなるのでしょうか? カラムを削除したらそのカラムに関するデータが失われるだけですか?
>>655 ALTERでMODIFYしてる分には失われないよ
サイズとか種類とか変えるとそれにあわせて
欠損したりするけど大体はまあいける。
657 :
655 :2010/03/28(日) 21:02:27 ID:???
>>656 ありがとうございます。
データの型を変えてもデータが失われないというのは意外でした。
実は会社のデータベースをいじる業務を任されましてテーブルの型を変えるのが怖かったのです。
動作中のWebサービスのテーブル構造を変えるのはよく行われることなのでしょうか?
型変更中はテーブルロックがかかりシステムが停止しますので、 行われません。 別のところできちんとテスト、リハーサルをして データのバックアップを取って何が起こってもいいようにしてから 取り組みましょう。
659 :
655 :2010/03/28(日) 21:52:20 ID:???
おおなるほど…アドバイスありがとうございました。 カラムを変える時はバックアップ取って慎重に行うようにします。
660 :
NAME IS NULL :2010/03/29(月) 04:19:42 ID:QIgYQPPM
mysqlのデータファイル(/var/mysql/*)のパーミッションを700にしています。 sudoでmyisamchkコマンドを実行すると、 File '/var/mysql/*/*.MYI' doesn't exist と言われます。 sudoでなく、rootになって実行すると、このエラーは出ません。 挙動から考えるに、 sudoなのに、ファイルの検索が一般ユーザで行なわれているようです。 何故、こんなことになるのでしょうか?
Bash等で、ディレクトリやファイルの引数リストを */*とかにした場合は、 コマンドに渡る前にbashが各ディレクトリ/ファイルに展開してからコマンドに渡す。
質問させてください。 3つのフィールドfieldA,fieldB,fieldCがあるとします。 fieldAとfieldBはINT型です。 fieldC = fieldA +fieldB としたい場合、fieldCはどのようにCREATEしたら良いでしょうか?
>>661 そういうことだったのですか
ありがとうございました
>>662 普通にint型としてCREATE。
デフォルト値として指定できるのは定数だけのはず。
計算はプログラム側でやるか、もしくはトリガ使いなはれ。
テーブル考えるのも難しいね。 できるだけ幅広く対応できるようにリレーショナル組むと ばっらばらで、どこに何のデータがあるのかわからなくなるし、一気に複数のテーブルを 読み込んで最終的にデータが重くなる。 かといってシンプルに組もうと思うとあとで拡張するのがしんどくなる。 テーブルの組み方もやっぱりセンスなのかな? みんなはどう? 一度組んであーしとけばよかったー・・・って思うときある?
666 :
631 :2010/03/29(月) 14:41:24 ID:???
>>632 遅くなりましたが、ありがとうございました。
myodbc3.5.1とmyodbc5.1は別個にインストール出来たんですね。
5.1.42 WinXP my.iniで [mysqld] transaction-isolation = SERIALIZABLE にしたんだけど、それが指定されたことってコマンドではどうやって確認出来ます? show variables; だと件数が多すぎて判らんっすw
668 :
667 :2010/03/30(火) 11:40:58 ID:???
自己解決 SELECT @@global.tx_isolation; SELECT @@tx_isolation; でできました
会社のシステムのMySQLのパフォーマンス調査をしています。 ログを調べてみると大量のデータが入ったテーブルから SELECT * FROM 〜〜〜 LIMIT 1 というSQLでデータを取得しているクエリがたくさんあったのが気になりました。 LIMIT 1という指定は対象テーブルに含まれるデータ量に関係なく 1件のデータを読むだけの処理になるのでしょうか? あるいは重い処理になりますか?
クエリーの重さはWhere次第、データ通信量は1件のみだから減る、でいいんじゃね?
>1件のデータを読むだけの処理になるのでしょうか? そうですよ。 ORDER BY併用のときはかなり軽くなる可能性。 最小値、もしくは最大値だけ算出されれば、後は何億件該当があっても関係無いはずだもんね。
672 :
669 :2010/03/30(火) 19:42:57 ID:???
回答ありがとうございました。すっきりしました。 違う箇所を調査してみることにします。
>>669 slow ログと profile を有効活用すべし
version や環境によるけど一定時間 slowlog を 0秒にして、
全クエリを取得し、それを myslowdump で解析したら
改善すべきクエリが見えてきやすくなる。
# -s オプションの 「t: query time」 などを利用
0.1 秒程度だから大丈夫とか思ってるようなクエリでも、
それが全処理時間の 50% をしめるならば、そいつを半分の
時間で処理できるようにするだけで全体としては 25%稼げる。
クエリによっては半分にするのもそれほど大変じゃないしね。
MySQLサーバに接続回数が何回あったとか確認する方法はありますでしょうか? 今アプリケーションを作っていて、 オーバヘッドを少なくするために、できるだけ接続回数を少なくして処理するよう組もうと思ってるのですが、 アプリケーション側の挙動(関数などの)がイマイチ理解できていないもので、 実際にどのくらい接続してるのか目で確かめることができれば、試行錯誤できるのですが、 FTPサーバのようにリアルタイムでユーザの接続状況がわかるような機能や、 外部アプリケーションがあったら教えてください。
>>674 show global status;
を数秒おきに取得して差分を見る
>>674 675 でも書いてあるけど
「show global status like 'Connections';」
でmysqld起動後の接続合計が出るのでそれの差分をとる。
うちでは、1分毎に cron で取得して秒で割ってグラフ化してる。
専用のAPIがあれば負荷やMax_Connectionなどを気にしなくていいので
もっとうまい方法考えるんだけど、恐らくない。
あとは、「show processlist;」をみれば現在の接続数がわかる。
678 :
674 :2010/04/01(木) 02:25:00 ID:???
レス遅くなってすみません。
>>675-676 どうもありがとうございます。
早速その方法でテストしてみたいと思います。
>>677 どうもありがとうございます。
開発環境はWindows、本番環境もLinuxなのでちょっと無理ですが、
こういうのもあるんだということを今後のために頭に入れておきたいと思います。
レスくださったお三方ありがとうございました。
違うってw この間マニュアルを眺めてて発見しただけ。使ってみると便利だよ。
root権のない共用レンタルサーバにおいてエンジンがイノデービーのテーブルのバックアップをとりたいのですが、 調べても停止させることが前提の記事が多く、 公式で停止させないで取れるツールみたいなのが紹介されてましたが、 有料な上リンクぎれだったりと、なかなか有用な情報にたどり着けませんでした。 そこで、 show tablesでテーブル一覧を取得後に、 show create table テーブル名で返ってきた値からSQLの部分を取り出したのをバックアップし、 select * from テーブル名(たくさんデータが入ってるテーブルはlimitをつけて分割して)で返ってきた値を、 insert文に加工したものをバックアップっていうように考えているのですが、おかしいですか? もっと適切な方法がありますでしょうか?
>>681 mysqldump で調べてみなはれ。
683 :
NAME IS NULL :2010/04/02(金) 02:13:07 ID:fk2DP0Cs
DBのカラム名について聞きたいのですが、 cakephpに習って管理用カラムをidのauto_incrementとし、 英字のカテゴリ名と日本語のカテゴリ名を設定したいです。 以下のような感じにしようと思いましたが、keyが予約語なので、嫌な感じがします。 一般的に英字と日本語をひとつのテーブルに設定する場合、このようなカラム名にするといいよ というのが、ありましたら教えて欲しいです。 create table category( id int not null auto_increment primary key, key varchar(10), name varchar(20) )
データベースに追加するだけの関数をマルチスレッドにしても問題ない?
select flag, count(*) as ct from table group by flag; でflagでグループ分けした件数をctで取得できるんですが、このctが3以上の結果のみを出そうと、where句にctを使うとエラーになります。 どうすればやりたいことができるでしょうか?
688 :
NAME IS NULL :2010/04/04(日) 18:34:15 ID:EfdzWcJ/
blob型に整数を入れるにはどうしたらいい? バイナリーだからそのままでいいと思ったけど1を入れてhexで16進表示させたら31になったから文字列扱いされてるっぽい
690 :
NAME IS NULL :2010/04/06(火) 01:42:07 ID:xi7G4+Bq
会社のシステムのMySQLを運用して3ヶ月になります。 一つのDBサーバで4つのサービスを動かしているため、かなり負担がかかっています。 状況改善を指示されたため自分なりにネットで調べたところ、レプリケーションを行うのが良さそうだという結論になりました。 しかし、サーバをいじる経験が乏しい上、データベース自体の経験も3ヶ月です。 レプリケーションを行うことで既存のデータが壊れてしまうのがとても怖いです。 サーバを追加してレプリケーションを行うのは、素人に毛が生えたような技術者でも行える作業でしょうか? あるいはリスクがあるのであれば他の対処法を教えていただけないでしょうか。 宜しくお願いします。
クエリーやサーバーのチューニングは十分行っているのかな 重い原因は判ってる? レプリケーションしても参照系しか分離出来ないよ 5、6台並べてClusterとかもあるけど、ベンダー呼んだ方が良い 単純にサーバーのメモリ増やすだけでも良いかもしれないし マスターを複数にすると同期処理が面倒だし そもそも、業務アプリ自体の改修が可能なのかな
ストレージ負荷とかメモリ負荷とかCPU負荷とかまず調べないとわからんちん 下手にレプリするより、より強力なサーバーに適切なチューニングして動かしたほうがいいんでねーの?
1つのサーバで4つのサービス動かすのやめて 2つないし4つのサーバで動かせばいいじゃん レプリケーションいらないじゃん
694 :
690 :2010/04/07(水) 01:24:40 ID:???
アドバイスありがとうございます。
>>691 >>692 重い原因は分かっておりません。
1日のページビューが4つ合わせて20万ぐらいなのですが、
マシンの性能はかなりハイスペックなのでどうして重くなってしまうのかが分かりません。
4つのサービスのうち2つが重くて残りの2つは快適に動くのが不思議なんです。
とりあえずレプリケーションは大変そうですね。
頂いたアドバイスを考慮すると時期早々な気がするので違う方法を考えてみることにします。
>>693 ごもっともなのですが、サービスは絶対に止めるなと言われてるのでデータ移行するのは少し怖いですね
どういった対策をするにしても、まず重い原因を調べるのが先だろう
・・・負荷が何にかかってるか調べるのが先でねーのw
>>694 mrtgなり何なりでサーバーのハードウエア負荷状態を調べる。
slowqueryを調べる
あとサーバーの構成も晒してみたら?
MySQLにinsertしたはずのレコードが入っていないという現象が 時々起こります。 具体的には、ブラウザからFORMで10個ほどの自然数のデータを送り、 PHPで、データ処理をして正誤を表示します。 送った10個のデータは、ひとつのレコードとしてMySQLに格納します。 通常は正常に動作しますが、一見正常に動作しているように見えて、 データベースに、この10個のデータのレコードが残っていないことがあります。 60〜70回やって3回起こりました。 特にエラー表示などはなく、ブラウザには結果が正常に表示されます。 また、同時にデータベースとは他のやり取りもしており、これらも正常に動作し、 そのレコードも残っているので、データベースとの接続には問題ないようです。 このようなことはよく起こるのでしょうか? 対策としてinsertしたデータを、MySQLから再度呼び出して確認するなどの 機能を加えた方が良いのでしょうか?
トランザクションにしててコミットしてないんじゃ?
700 :
698 :2010/04/07(水) 12:34:25 ID:???
いえ、トランザクションにはしていません。 ごくごく単純なシステムです。 大抵は順調に動作しています。 たまにレコードの挿入だけがされていないという現象です。
sqlが発行されてないだけとかじゃない? sql自体をログに取ってちゃんとinsert分が発行されてるかとか
「ひとつのレコードとして」 「一見正常に動作しているように見えて」 「結果が正常に表示されます」 説明が具体的でないから、何をどうして何が起きたのかさっぱりわからん。
698は包茎なんだよ。許してやれよ。
>>698 の作り込んだバグだよ。
一見うまくいっているように見えるのは
INSERTしたときの情報を表示しているからだ。
アホな質問ですみません windows版のmmeasureみたいな監視ツールってあるでしょうか。 centosにでもすりゃいいんですがパソコンが一台しかなく、既にブログなどを実運用してるので…
VMwareを入れてCentOSを入れて その中にmMeasureを入れて、 WindowsのMySQLを監視するというのができそう
>>706 そう来たか…
っていうかムリだと思います。
出来てもやりたくありません。
中学生の君か 子犬を飼うのがいいと思うんだけどな 結果的にvmware入れるのと変わらないが
cygwinならきっとやってくれる
MySQLがオラクル社のものに・・・ ってところは意外と話題にならないんだな 日本人は寛容だねえ
何を今更・・・
近年稀にみる情弱
714 :
698 :2010/04/13(火) 11:03:22 ID:???
色々アドバイスを頂きまして有難うございます。
対策としてinsertしたデータを、MySQLから再度呼び出して確認する機能を
加えて運用していたのですが、同じ問題が出ました。
そして、ある特殊なケースにこの問題が発生することがわかり、
>>704 さんの
仰るようにバグでした。
MySQLのカラムでINT型を指定しているカラムに文字列をインサートしようと
した時に、レコード全体がインサートされていませんでした。
直接SQL文で、MySQLのINT型を指定してあるカラムに文字列を
インサートした場合には自動的に0が入力されるのですが、
WEB上のPHPからMySQLにインサートした場合にはレコード自体が
インサートされないようです。このことで解明に時間が掛かりました。
このあたりのMySQLの挙動の違いについて調べていますが、あまり出てきません。
参考になるものがありましたらアドバイスをお願い致します。
>>714 データの保証やサニタイズは、
アプリケーションでしっかり実装するべき。
716 :
698 :2010/04/13(火) 12:29:16 ID:???
>>715 そうですね。
MySQL mode について調べているのですが、なかなか出てこないのは、
アプリケーションでしっかりやっていれば、モードの違いは
関係ないからなのかも知れませんね。
717 :
NAME IS NULL :2010/04/13(火) 23:18:27 ID:L+sC4y4n
varchar(255)のカラム2つ+varchar(10)のカラムに複合インデックスを張ろうとしたのですが、エラーでmax key lengthは1000byte以下でないとダメと言われてしまいました。 255x2+10でもだめなんでしょうか?
すみません、超初心者なんですが、質問させてください。 デッドロックが発生した場合って 1.サーバーを再起動する 2.MySQLのkillコマンドでスレッドを潰していく 以外に、復旧する方法ってあるんでしょうか?
MySQLだってデッドロック検出くらいあるだろう。 デッドロックを起こしたトランザクションの一方(あるいは両方)が一定時間後に ロールバックされる。
>>717 charset utf8 とか sjis にしてないか?
binary か ascii で試してみ。
INT型のカラムに文字列をつっこんでおいてバグ呼ばわりか・・・ 雑なPGとは付き合いたくないな
SQLiteならきっとなんとかしてくれる
SQLiteは実質型ないだろ
724 :
718 :2010/04/14(水) 23:43:48 ID:???
テーブルの使い方が悪いのか デッドロックが発生するとずっとロックがかかったままになって ロールバックしてる気配がない orz
>>725 更にこ〜ゆ〜のが存在するとはね
レベル低いのぉ
>>724 MySQLはデッドロック発生時に自動でロールバックする。
(ちなみにOracleはロールバックしない)
なので、何か勘違いしていると思われます。
>>725 ここはMySQLスレ
intに文字列を突っ込もうと言うバグがあるのは
>>698 のプログラム
判る?
>>725 DB関連扱うなら、サニタイズとかXSSやSQLインジェクションとかプレースフォルダとかプリペアドステートメントとか
ちゃんと覚えてからやらないと、バグ作り込むことになるよ。
誰も「MySQLのバグ」なんて言ってないのに。
そんな勘違いする奴が一気に大量発生するのは不自然すぎるよ
>>721
今のところ「
>>704 さんの仰るように」が分からん
日本語会話の駄目なのが三匹くらい?
全部同じ人じゃないの 俺にはそう見える
734 :
718 :2010/04/15(木) 21:56:27 ID:???
>>728 デッドロックじゃないかもしれないんですが
私が現在調査しているのが
ロックをかけていたセッションがロックを解除しないまま死んで
ロールバックせずにロックが掛かったままになっている・・・・・・
んじゃないかみたいな現象が起きていまして
何かコマンド叩いて、ロックの原因が分からないかだとか
何かコマンド叩いて、簡単に復旧しないかだとかです。
ネットの検索も色々とやっていますが、いまいち今回の内容に合致する
ものがHITしないです。
そりゃ解決しないわ。「デッドロックの質問」に答えた人もずっこけてるんじゃないの? で、そのロックは本当にかかっているの?どうやって現象を確認したのか具体的に 書いた方がいいよ。
736 :
NAME IS NULL :2010/04/16(金) 00:04:51 ID:drrcR7JB
MySQLでデータを汎用的な形に持つことって可能でしょうか? 自端末のMySQLで作った数百メガバイトのDBデータを レンタルサーバーのMySQLでも使用したいんですが、初回コピー時は大量のInsertをしないと いけないためあまりやりたくない(無理)です。 ですので汎用的な形にしてレンタルサーバーにコピーしたいのですが 方法ってありますか?
738 :
718 :2010/04/16(金) 01:09:21 ID:???
>>735 説明が下手で申し訳ないのですが・・・
Aの画面を操作する時はCのテーブルを使用します
Bの画面を操作する時もCのテーブルを使用します
別々の所からのアクセスでAとB画面から同時にCのテーブルを扱っているようなのですが
(どちらかは待ち状態になってたと思います。)
見た目上は両方操作が正常に終了している感じなのですが
トランザクションの開始はログに出ているのですが終了は出ておらず
ロックがかかりっぱなしの状態になり、以後Cのテーブルを使う操作をすると
タイムアウトになっている感じです。
>>738 永続的な接続をしてんのにロックしてるんじゃね?
>>731 INTに文字列つっこんでる時点で十分マスケだろうが
>>736 汎用的な形ってどういうのよ?
SELECT〜INTO OUTFILE でCSVにでもして、
そのCSVをレンサバにFTPででも上げて、
CSVエンジンで使うとか?
レンサバでCSVエンジンが使えるかどうかは知らないけど。
フルテキストインデックスについて質問です。 例えば (id, text) といったカラムを持つテーブルで id >= 100 AND id < 200 の行において text に含まれる単語の出現頻度を得ることは可能でしょうか。 text は適宜分かち書きされた文書でフルテキストインデックスが貼ってる 仮定で 2ch 128 もなー 256 : みたいな結果を得る方法があれば教えてください。
出現頻度を得たい語を指定したSQLでいいの、全域スキャンしてとにかく全部の語についての 頻度一覧を得たいのか。
>>744 頻度ランキングなどに利用したいので単語は指定しない SQL です。
なので、どちらかというと後者。
746 :
NAME IS NULL :2010/04/17(土) 23:29:49 ID:zyaLhyEY
初歩的な質問ですみません バックアップからリストアしようとしている途中で 「ERROR 2013 (HY000) at line 353: Lost connection to MySQL server during query」のメッセージが出て中断されます。 何かいい方法はないでしょうか? /etc/my.cf では [mysqld] max_allowed_packet = 16M に設定しています。
すごく…大きいです…
じゃあ腹ん中がパンパンになったか、タイムアウトしたかのどっちかだな
おなかの中でパンパンに大きくなっちゃうと、大変ですよね・・・ 少しずつ抜くしかないかも
ローカルのphpMyAdminでテーブルを作成する時にテーブル名を 大文字で入力し作成しているのですが、 テーブルを作成し終わるとなぜか小文字になってしまってます。 何が原因でしょうか? ※Windows Vista
質問させてください SQL文の文末についてですが 〜';で終わらなければいけないところを 〜':"; こんな感じで書いていたところがありエラーログが出ていました ・・・・が、正常にSQL文が実行されているようなのですが、これはMySQLの親切機能みたいなものなのでしょうか? 適当なSelect文の文末を↑みたいにわざと間違えて実行したところエラーのウィンドウは表示されますが その後正常にSqL文が実行されるのを確認しました。
>>751 ttp://dev.mysql.com/doc/refman/4.1/ja/name-case-sensitivity.html >データベースとテーブルは、ディレクトリとそれらのディレクトリ内のファイルに対応しています。
>そのため、ベースとなっているオペレーティングシステムで大文字と小文字が区別される場合
>(ケース依存)、データベース名とテーブル名でも大文字と小文字が区別されます。
>つまり、Windows ではデータベース名とテーブル名で大文字と小文字は区別されず
:
> この問題に対処する 1 つの方法は、mysqld の先頭に -O lower_case_table_names=1
>を付けることです。このオプションのデフォルトは Windows では 1 で、Unix では 0 です。
>lower_case_table_names が 1 の場合、MySQL では、保管およびルックアップ時にすべての
>テーブル名が小文字に変換されます
phpMyAdminの話で申し訳ないがちょと質問 フィールドの順番を変えたいのですが どうやるんでしょうか? フィールドを追加していったらよく見る必要なフィールドが画面外に orz フィールドの後に追加というのはわかりましたが 「構造」やら「操作」を見てもそれらしいものが見あたらず…
順番入れ替えるのは無かったはず。テーブル作り直しするしかないんじゃない?
>>754 SQLを直接書いたら何とか。
ALTERしてUPDATEしてALTERしたら。
757 :
754 :2010/04/20(火) 20:18:38 ID:???
レスサンクス。 phpMyAdmin上で一発では無理なのね。 756さんのようにコマンドで変えるか 755さんのように作り替えするか。
小手先でやるなら、新しいフィールドを作ってから、 update table set newfield=oldfield してから、古いフィールド削除して、フィールドのリネームなのかな? ※バックアップは忘れずに。
759 :
754 :2010/04/20(火) 21:19:26 ID:???
ああ、そっか、そういう手があるか、頭良いな〜。 エクスポートしてコピペしようかと思ってたw
ビュー作ればよくね?
Accessでリンク貼って好きに並び替えればよくね?
763 :
NAME IS NULL :2010/04/22(木) 13:25:49 ID:qCWVP7Km
SQL文のUPDATEで「飲食店 あいうえお」となっているレコードを 「あいうえお」だけに更新したいのですが、SQL文だけで出来ますでしょうか? 出来る場合は、SQL文のアドバイスをお願いします。
UPDATE テーブル SET カラム = RIGHT(カラム, CHAR_LENGTH(カラム) - LOCATE(' ',カラム)); ただの思いつき、検証なし、ダメモトで。
765 :
NAME IS NULL :2010/04/22(木) 16:02:00 ID:Jt63om4K
質問ですみません。 PerlでDBIを使用しMySQLを使用しているのですが、Perlから 何かしらのコマンドを送り、そのプロセス(プログラム内)で のみ指定の日時でどうさせるようなことは不可能でしょうか。 たとえば「set names ujis;」とプログラムから送信すると、 そのプロセス内でのみEUC文字列の扱いが優先される形と なりますが、これと同じように時刻情報も操作できない ものかと思っております。 よろしくお願いいたします。
forkするとか
具体的に何がしたいのか書いた方が解決策出やすい気がする
ご返答有難うございます。 20個くらいnow()で指定されているプログラムがあり、日付を 好きなように遡って検証したいといわれたのですが、 これらを変更しないでどうにかできないかと思い質問させて いただいた次第です。 よろしくお願いいたします。
変更しない、というのはプログラムに埋め込んだSQLのこと? データ変更していいなら直接SQL叩くとか 時刻はOSで1つのグローバルな場所から都度持ってくるから プロセス内だけというのは難しいかも、OS次第かもしれないけど。
スクリプトコピって、now()の代わりに適当な値渡すように書き換えれば?
それはperlの範疇だなぁ sub now {return time; } *main::now = sub( reutrn 1; ); もしくは *CORE::GLOBAL::time = sub { return 1; }; もしくは use subs qw( time ); sub time { return 1; }; で関数を上書きすれ テストの基本だべ
772 :
NAME IS NULL :2010/04/23(金) 15:51:17 ID:SnyNKn8S
商品(shouhin_id)ごとに情報が入っているテーブルから 各商品ごとの最新情報10件以降を消したいのですがどうすればいいでしょうか? 残したいデータ select * from data where shouhin_id=1 order by update desc limit 10; shouhin_id=1の部分はたくさんあります。(shouhin_id=2,3,4,5,6...) これはループでまわします。 それ以外を消すにはどうしたらいいでしょうか?
最新情報10件のテーブルを作ってください
ほんとだ難しい 思いつかんかった
delete from data id NOT IN (select id from data where shouhin_id=1 order by update desc limit 10); これは動かないでしょうか、検証してないけど。
delete from data where id NOT IN (select id from data where shouhin_id=1 order by update desc limit 10); whereが抜けてた。
777 :
NAME IS NULL :2010/04/24(土) 01:51:50 ID:+dWDx83M
バイナリログって全部保存しておくものですか? 尋常じゃない量になりそうなんですが
バイナリログなんて取ったこと無いわ
バイナリログの定番の運用法ってよく分からないよね。 バックアップ取ったら定期的に purge するもんだと思ってるけど。
my.cnfで設定すれば勝手に消してくれるよ
レプリケーションのために取ってる。だから、すぐ捨ててる。
my.cnfで寿命を1日くらいに設定しているということでしょうか レプリケーションに失敗した時の巻き戻しに バイナリログはなくてもOKですか?
レプリケーションなしの場合は、バイナリログというのは フルバックアップを取った時点から現在までロールフォワードするためのもの。 フルバックアップを3世代取るとして 4/04 フルバックアップA取得 4/11 フルバックアップB取得 4/18 フルバックアップC取得、4/03までのバイナリログを削除 4/25 フルバックアップA取得、4/11までのバイナリログを削除 ... って運用する。 Oracleなら普通だけど、まあMySQLでここまでやってるのは見たことないな。
フォームからチェックボックスで趣味を複数選択した時の事で質問なんですが ID 名前 性別 趣味 001 aさん 男 音楽、ドライブ、映画 005 bさん 女 料理、読書、音楽 こういった場合下のように趣味のテーブルを分けて foreachでデータを入れるのが一般的なんでしょうか? ID 名前 性別 001 aさん 男 005 bさん 女 ID 趣味 001 音楽 001 ドライブ 001 映画 005 料理 005 読書 005 音楽 なんだか冗長に見えるけどあってます?
大体あってる。 が、一時的に最初の形のテーブルに入れといて、 後でバッチ処理で正規化する場合もある。
>>785 レスどうもです。
DBほとんど弄ったことがなかったので助かります。
ありがとうございました。
foreachするならデリミタが指定できるんで最初の形のテーブルでもいいんじゃないのかな。 趣味マスタとか作らないんなら、使うときにexplodeするとかのがコードが簡単かもしれんね。 ただ、ボリュームや優先順位、用途を知らんから何とも言えんけど
mysql+php(Vertrigo)で蔵書のデータベース作ろうと思ってるんだけど 小説とか雑誌とか単行本とか参考書とかで必要な列が違うんだけどこういう場合それぞれテーブル分けるべき? それとも被ってるところもあるしnull値OKにしてひとまとめにした方がいいですかね? 後者の場合は必要なデータだけPHP側で表示させる感じで データは多分1万レコードくらいで検索とかも出来るようにしたいんだけど
その前に、検索出来ないRDBがあるのかどうか聞きたいね
プライベート用と考えて、俺なら分けないけど人それぞれだからなぁ。 分けない場合も後で本の種類が増えて行く時が不便だから、極力被らない列を減らす努力がいるな。 何入れてもいい列をつくって共通化を図るとか。 テーブルを分けると後で本の種類が増える度にテーブルの追加+PHPのコードまで書き換えになるからなぁ。 どっちでもいいっちゃどっちでもよさそうだけどね。
>>790 なるほどdクス
これぐらいのレコード数ならクエリ複数発行しても大して速度変わらないかな
管理しやすそうですしテーブル分けて作ってみようと思います
すべての共通項目を持ったテーブルをまず一つ作ってだな
書籍 (書籍ID, 書籍名, ISBN) 属性 (属性ID, 属性名) 書籍属性 (書籍ID, 属性ID, 属性値) 属性テーブルには著者名、出版社名、値段、備考、などを入れる
AUTO_INCREMENTなカラムを主キーにせずに作る方法って無いかな。 REPLACE INTO 〜 を使うときに、別のユニークキーを使ってるんだけど 念のため飾りで通し番号もほしいときにどうしたらいいかわからんです。
すみません、質問です。 order by type asc, rand() このような並び替えルールを設定した場合、 typeの照準でまず並び替え、そのあとランダム にしているのでしょうか。
はい、そうです
そのあとっつーか、同じ順位の物同士がランダム
おかしな質問かもしれませんが、 テーブルAを参照している他のテーブルを知ることはできますか? 次のような状態に陥っています。 1.テーブルAを作成 2.外部キー制約によりAを参照するテーブルBを作成 3.テーブルBを削除(DROP TABLE) 4.テーブルAを削除しようとするとエラー ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails 説明のためAとBを連続して作成していますが、実際には別々に作成しており、 どこか別のテーブルから参照されているのではないかと考えてるのですが・・・ よろしくお願いします。
>>794 もしかして、レコードがあったらアップデート、無ければインサートをやりたいのかな?
直接的な回答じゃないが、自分はカラムにUnique制約付けて、
insert〜
on DUPLICATE KEY UPDATE〜
ってやってる。パフォーマンスはこの方が良さそうなもので。
期待値が違ってたらごめん、無視してくだされ。
>>799 人間が目で見て確認というので良いなら、
全テーブルに、「show create table テーブル名」で
テーブルAへ外部キー参照してる奴が見つかるでしょう。
>>800 いや、あろうがなかろうがUPDATEする って感じのイメージなんだけど
そのときに、触ってないカラムはそのままにしたいんだよね
いや、違う!勘違いしてた!
>>800 の方法で解決だ!うっかりしてた!この手があったか!
あ、ダメかも。ちょっと実験してみる。
805 :
800 :2010/04/28(水) 01:36:41 ID:???
>>804 試してみてくらはい。
ちなみに自分のコードは↓こんな感じ。
INSERT INTO テーブル (`user_id`, `col1`, `col2`)
VALUES ("user001","$val1","$val2")
ON DUPLICATE KEY UPDATE `col1` = "$val1", `col2` = "$val1"
テーブルは
CREATE TABLE `テーブル` (
`id` int(11) NOT NULL auto_increment,
`user_id` varchar(32) NOT NULL,
`col1` varchar(64) NOT NULL,
`col2` varchar(64) NOT NULL,
UNIQUE KEY `unique_key` (`user_id`,`col1`)
) ENGINE=InnoDB DEFAULT CHARSET=sjis;
これだと、`user_id`,`col1`のユニーク制約に引っかからない場合はINSERT、制約に引っかかる場合はUPDATEが走ります。
http://dev.mysql.com/doc/refman/5.1/ja/insert-on-duplicate.html
select * from information_schema.referential_constraints; でおk
DBサーバを冗長化する方法を調べています。 ・トランザクションの開始と終了を同期させる。 ・1つのDBに対して複数のトランザクションを同時に 実行しない (そもそもできるのかよく分かってないのですが…) これで2つのDBの内容を同期できると考えているのですが そういうわけでもないのでしょうか? よろしくお願いします。
SELECT * FROM `information_schema`.`TABLE_CONSTRAINTS` WHERE `CONSTRAINT_SCHEMA` = 'DB名';
質問よろしいでしょうか。 MySQLのバージョンは5.1系を想定しています。 「複数のテーブル全てにおいてユニークなID」を発行したいのですが、良い方法をアドバイスお願いします。 現在は 「ユニークIDカウントテーブル」を作り、 UPDATE tbl_id_counter SET id = id + 1; SELECT id FROM tbl_id_counter WHERE 1; こんな感じでIDを発行しようとしています。 tbl_id_counterテーブルにはレコードは1つしかありません。 この方法ですと、UPDATEとSELECTの間に他のユーザーのUPDATEが入ると、取得するIDが重なってしまう危険性があります。 LOCKすれば良さそうなのですが、他に何かより良い方法はありますでしょうか? 「UPDATEするとともに結果を取得する方法は無いものだろうか?」 というのが、現在自分が思いつくアイデアです。
サーバのメモリ周りに関する質問です。
メモリの確保が思った以上におおくて、スワップアウトが発生してしまいます。
メモリの計算を何か間違えているでしょうか?
実メモリは8GB、mysql単で動いているサーバです。
下記はmymemcheckの結果を抜粋したものです。
OSはFreeBSD7.2-R amd64、mysqlは5.1.45を使用しています。
--- topの結果の一部 --- (mysqldの再起動直後で、時間がたつとswap使用率が98%とかになります)
Mem: 5856M Active, 863M Inact, 629M Wired, 406M Cache, 399M Buf, 40M Free
Swap: 2048M Total, 61M Used, 1987M Free, 2% Inuse
PID USERNAME THR PRI NICE SIZE RES STATE C TIME WCPU COMMAND
83172 mysql 2713 44 0 16302M 5902M ucond 1 0:04 4.05% mysqld
--- mymemcheckの結果の一部 ---
min_memory_needed = global_buffers + (thread_buffers * max_connections)
= 7240417280 + 65536 * 3000
= 7437025280 (6.926 [G])
[ 32bit Linux x86 limitation ]
ref
*
http://dev.mysql.com/doc/mysql/en/innodb-configuration.html * need to include read_rnd_buffer.
* no need myisam_sort_buffer because allocate when repair, check alter.
2G > process heap
process heap = innodb_buffer_pool + key_buffer
+ max_connections * (sort_buffer + read_buffer + read_rnd_buffer)
+ max_connections * stack_size
= 6291456000 + 402653184
+ 3000 * (8192 + 8192 + 8192)
+ 3000 * 262144
= 7554269184 (7.035 [G])
2G > 7.035 [G] ... LIMIT OVER!!
>>810 ありがとうございます。
LAST_INSERT_IDに引数が渡せるとは知りませんでした。
こちらを利用させていただきます。
質問させて下さい。 テーブルAは連番IDでログのように記録しています。 重複するデータがたくさんあります。 テーブルBは、テーブルAの要素の補完のようなもので、タグ付けを行っています。 テーブルBから、指定したタグ「small」と一致するレコードを検索するSQL文を作りました。 (重複する animal は省きたいので DISTINCT を入れました) SELECT DISTINCT animal FROM table_B WHERE tag = 'small' 以上で希望する結果になったのですが、 この結果を、table_A で、最も新しく出現する順番に(id降順)ソートさせたい場合 SQL文はどのように書けばよいのでしょうか? サブクエリ等調べてはいるのですが、手持ちの資料が少なく困っています。 MySQL 5.1です。
814 :
813 :2010/04/28(水) 19:18:32 ID:???
table_A ----------- id animal ----------- 1010 cat 1009 dog 1008 dog 1007 cat 1006 bird table_B ----------- animal tag ----------- cat small cat big dog small dog big
SELECT DISTINCT tb.animal FROM table_A ta, table_B tb WHERE tb.tag = 'small' AND tb.animal = ta.animal ORDER BY ta.id
pdo を使用してデータを登録すると どうしても文字化けが発生してしまいます。 テーブルはsjisなのですがPDOではsjisは使えないのでしょうか?
817 :
NAME IS NULL :2010/04/30(金) 08:09:16 ID:KOHIXyIB
分からないんで質問します。 例えば、地元近辺の駐車場の空き状況をデータベースにして 駐車場管理者/利用者からお金を取るシステムを作ったとします。 MySQL自体は自分のサーバーに入れて誰にもいじらすことがない場合、 商用ライセンスが適用されますか? この場合だとソフト自体は売ってないですよね? 金が発生するなら即商用ライセンスですか? 何度読んでも商用ライセンスの意味が把握できません・・・
システムが自分の資産で 地主さんにサービスを提供する形態なら商用ライセンスは不要。 それでお金とられたら mixiとかGREEとかモバゲーがえらいことになる。 システム自体を1セット20万円とかで地主さんに売る場合は別。 商用ライセンス買わない場合はシステム全体がGPLになる。
819 :
817 :2010/04/30(金) 13:17:04 ID:???
>>818 システム自体は自分の資産ですから、
自分の場合、商用ライセンスは不要っぽいですね\(^o^)/
ありがとうございました!
無くてもいいけど別に買ってもいいんだよ MySQLの商用サポートはかなり優秀
821 :
NAME IS NULL :2010/04/30(金) 18:00:09 ID:LdmOaMfU
無理やりMySQLに関連付けて質問させてください。 レプリケーションで、DB2台構成(マスター、スレーブ)で運用を考えています。 参照の場合、はマスター、スレーブ2台に分散して見に行かせたいです。 この場合、プログラム(PHP)からはどのように読みに行かせればいいのでしょう? マスター:100.100.100.1 スレーブ:100.100.100.2 1:PHPのランダム関数で、1か2か適当に決める 2:mysql.example.comのようなアドレスを発行し、ラウンドロビンさせる 3:2の発展系、ロードバランサーで実装する 2の場合、DNSキャッシュが効いてしまい、ほとんど意味が無いような気がしてきました。 ご助言をいただけたらと思います。
じゃー1でいいんでないかい。 聞きに行くサーバが複数台あれば2でもいいんじゃないかいー。
823 :
817 :2010/04/30(金) 19:30:26 ID:???
>>818 逆に、GPLのまま売ってもいいなら商用ライセンスも要らないな。
売価の20万円で元がとれて、他に明かしたくない独自コードが含まれて
いるわけでもない場合はそれもありだろう。
バグFixってもサポートがパッチを当ててくれるわけでもない。バグ情報送ってくるだけ。 バグが原因で情報漏れおきてもMySQLが損害賠償してくれるわけでもない。自己責任。 障害調査は自前で運用できないとこなら必要だろうが、DBAいるなら不要。 サポートいるようなところがオープンソース使うはずないじゃんって話。 オープンソースで喰えると思ってMySQLに入社した人は頭おかしい。 世の中わかってないにも程がある。
826 :
817 :2010/05/01(土) 09:29:42 ID:???
>>825 情報、どうもサンクスコです
それなら尚更サポートなんて要らないですね
DBA居なくて運用しているところなんてあるんですかねw
因みにSQL自体はMySQLで勉強して、安定したらそのうちPostgreSQLに移ることにします
827 :
813 :2010/05/01(土) 10:41:19 ID:???
>>815 遅くなったけど有難う。動いたけれど凄く重かった。
試行錯誤して単一テーブルで済ますようにしたら改善しました。
828 :
NAME IS NULL :2010/05/01(土) 14:18:29 ID:Urgsz0Ia
駆け出しものです。 MySQL Migration Toolkitを使って会社で使っているmssql serverをマイグレーションしようと考えています。 ネットや書籍,セミナーなどあっちこっち出向くんですがあまり情報がありません。 一読しておけばよいような書籍・サイトさらにはセミナーなどご指南いただければ幸いです。
829 :
NAME IS NULL :2010/05/01(土) 15:03:29 ID:nm2RYB54
質問させてください。 回線断時にEndTransactionしようとするとアプリごと終了するのですが これはどうにもならない問題なのでしょうか?
830 :
NAME IS NULL :2010/05/02(日) 15:17:45 ID:ADUZBcvp
すみません、何も特別なことをしていないのに 突然MySQLとの接続が切れるんですが 考えられる原因は何ですか? どう対処すればいいんでしょうか? ↓こんな感じです mysql> ALTER TABLE tb1C MODIFY nama VARCHAR(100); Query OK, 5 rows affected (0.07 sec) Records: 5 Duplicates: 0 Warnings: 0 mysql> desc tb1C; ERROR 2006 (HY000): MySQL server has gone away No connection. Trying to reconnect... ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061) ERROR: Can't connect to the server Windows VISTA 64-bit mysql> status -------------- mysql Ver 14.14 Distrib 5.1.37, for Win64 (unknown) Connection id: 1 SSL: Not in use Using delimiter: ; Server version: 5.1.37-community MySQL Community Server (GPL) Protocol version: 10 Connection: localhost via TCP/IP Client characterset: sjis Server characterset: sjis TCP port: 3306 Uptime: 4 min 47 sec Threads: 1 Questions: 4 Slow queries: 0 Opens: 16 Flush tables: 1 Open tabl es: 9 Queries per second avg: 0.13 --------------
831 :
NAME IS NULL :2010/05/02(日) 19:00:03 ID:uTWZyACn
MySQLConnecter/netの質問もここでいいのかな?
>>830 最初のalter tableを実行した後、次にdescを実行するまでの間、結構時間が経ってたんじゃないの?
833 :
830 :2010/05/02(日) 23:16:15 ID:ADUZBcvp
>>832 いえいえ、それがページをめくるのにかかる時間だけ、
つまり、30秒も経ってないです
ちょっとググッたんですけど、wait_timeoutが原因ですかね?
と思って今、SHOW VARIABLES;やったんですけど
| wait_timeout | 28800
です
(秒から時間に治すと…8時間って…自分で設定した記憶はまったくありません)
これは原因ではないですよね?
今日はこれがもう二回も起きてます
こんなのじゃネットで公開したときに落ちるんじゃないかと心配です…
834 :
830 :2010/05/02(日) 23:40:59 ID:ADUZBcvp
836 :
830 :2010/05/03(月) 01:12:11 ID:???
>>835 それですね!
バグが報告されているヴァージョンが5.1.43以前で
自分のヴァージョンが5.1.37ですから間違いなさそうです
症状もまったくもって同じです
最新ヴァージョンにはもうパッチが当ててあるようですね
治っているならいいです、次回、折を見て最新ヴァージョンに切り替えます
それにしても2007年9月に報告されたバグが
去年の暮れまで放置されてたなんて
MySQLの開発って意外と杜撰なんですね…
ありがとうございました!
普通そういう使い方しないからなw
ここまでバージョンあがってるのにいまだにこんなバグ出るほうがおかしくね? 開発管理は最初から今まで進歩しないてアマチュアレベルだとおもうけどな
不具合修正にも優先順位がある。 メリットが少ない変更は後回しなだけ。 といいつつ正直、将来は心配。
動かないならまだしも、クラッシュするってサービス止まっちゃうじゃないか。 最優先で修正されるべきなんじゃないの?
今回の問題は あろうことか、「開発者側の当事者」が 「いや、俺も5.0.52で試したけど再現性なかったよ」 って書いたもんで、約二年間も放置されていた、ってことでしょう 実際には、バグ報告者は5.1.20でバグを発見しているんで 5.0.52で再現性を試みる自体が開発者としておかしいんですが ALTER TABLE程度でいちいちフリーズされるのはどうかと思います (「さいさい変更を加えるのは最初の設計が悪い」とかは言いっこなしですよ) まぁ、優先順位が高かったからこそ、二度目のバグ報告で 一ヶ月も経たないうちに対策されたんだと思います とにかく、自分は今回の件でMySQLに対する信用は落ちました
MySQLを擁護するつもりはまったくないけど バグの10個や20個で騒いでたらシステム開発はできんよ MySQL 5.1でこれまでに修正されたバグは3,500個以上 Oracleだって9.2.0.1〜9.2.0.8で修正されたバグは6,000個以上 Windows2000には出荷当時63,000個のバグがあると言われていた ちょっとスパゲッティな気はするけどね>MySQL
>>842 >MySQL 5.1でこれまでに修正されたバグは3,500個以上
あらららら、MySQL 5.1ってもう十分に枯れたシステムだと思ってたんですけど違ったんですね…
こうなるとPostgreSQLの修正されたバグの数が知りたくなりますね…
でも、今回の件は許せない
トヨタのリコール隠しくらい許せない
MySQLとポスグレはリリースタイミングが違うから期間ごとのバグ数比較してもしかたがないような気もする。 ポスグレは毎年新バージョンリリースしてるんで比較するなら8.4.1、8.4.2、8.4.3、8.4.4のバグ数と5.1.27以降のバグ数じゃね? ちなみにポスグレの8.4.0はリリースバージョンだから基本バグなしってスタンス。 今ざっくり数えてみたらポスグレの8.4は841から844で修正170くらいだな。
>>844 そんな殺生な…
と思ったら
>>845 誠に乙です
このスレでこう呟くのもアレですが
やっぱりPostgreSQL、いいなぁ…
>>846 だったらPostgreにすりゃあいいでしょーが w
客先とかの都合で変えられないんだったら諦めなしゃーないし w
>>847 元々最初に触ったデータベースはPostgreSQLでしたし、そのうち移ります…
世間様はまだMySQLを崇拝していらっしゃるんで、MySQLは完全に捨て切れないですが…
>>848 > 世間様はまだMySQLを
日本はPostgreが先行だったと思ったが。
>>850 なので、日本は例外的にPostgreSQLが大きなシェアを持っている。
けど、やっぱりLAMPってことでMySQLがかな〜りもてはやされたからねい。
日経うんちゃら読んでわかったつもりになった担当者がMySQLを強制
というのは普通にあった。
L inux A pache M isa P ostgre これで行くんだ。
PostgreSQLは品質が良いからバグが少ないのか ユーザが少ないからバグが抽出しきれていないのかが ちょっと分からない
ソース読み比べてみPostgresとMySQL なんでMySQLが低品質か分かるよ
正規化するための主キーの設定と検索速度?、今後のメンテナンス?で 悩んでいるため質問させて下さい。 重複しないカラムとして「ショップ名」があります。 (東京店、大阪店、....) ショップ名を中心に各店舗の人数とか売上とか細かい詳細があるため 複数のテーブルに分けて正規化します。 自分ではショップ名が重複しないから主キーにすれば良いかと考えますが こういう場合でもあえてIDみたいな数値型(INT型?)のカラムを作って それを主キーにした方が良いのでしょうか? (auto_incrementにすればさらに楽だから?)
857 :
855 :2010/05/05(水) 23:55:32 ID:???
追記 MySQLで各テーブルを見る時に ショップ名が入っていた方が分かり易いというのもあります。 ただ将来絶対にショップ名が変わらないという保証はないので そういう意味でメンテナンス的に?数値にした方がいい??
どれもやめたほうがいいと思うけどな。
主キー列を更新するっていうのが筋悪なので 名前が変わることのある店名のようなものは主キーにしないのが定石。 名前を主キーにすると外部キーをつけたときにメンテナンスしづらくなるし、 RDBMSによってはそもそも主キー列が更新できないものもある(TimesTenとか) なので店舗IDを主キーにするのがふつうで、これをauto_incrementにするかどうか。 auto_increment列は売り上げとか日々データが増えるテーブルに対して つけるものだと考えているので、私なら店舗IDはauto_incrementにしない。
>>856 ソース読むんだよ、坊や。
バイナリ拾って「あぁグチャグチャやんw」って言っちゃダメだよ、坊や。
862 :
855 :2010/05/06(木) 15:46:25 ID:???
>859 わかりやすい解説ありがとうございました。 >なので店舗IDを主キーにするのがふつうで、これをauto_incrementにするかどうか。 >auto_increment列は売り上げとか日々データが増えるテーブルに対して >つけるものだと考えているので、私なら店舗IDはauto_incrementにしない。 入門書や初心者向けのサイトだと idを主キーにしてauto_incrementにしているため そういうものかと思っておりましたが 日々増えるデータに対して割り当てるですね。 たしかに店舗IDだとそうそう増えるものではないため 自分がわかりやすい数値にすればいいわけか。 ありがとうございました。
mysqlについて質問です よろしくお願いします table_a |orders_id|orders_date| | 1 |20100101 | | 2 |20100101 | | 3 |20100101 | table_b |orders_id|shop_kind| | 1 | 0 | | 3 | 1 | table_bのshop_kindが1以外のものと、table_bにorders_idは無いがtable_aにorders_idが存在するレコードを抽出したいのですが、クエリをどう記述すればいいかわかりません 以下のSQLのXXXXXXXに何か入れればできそうなのですが、どうすればいいですか? select ta.orders_id from table_a ta left join table_b tb on (ta.orders_id = tb.orders_id) where (tb.shop_kind !='1' or XXXXXXX); 結果はorders_idが1と3のものが取れればいいです
864 :
863 :2010/05/06(木) 16:37:58 ID:???
すいません訂正です >結果はorders_idが1と3のものが取れればいいです 結果はorders_idが1と2のものが取れればいいです
MySQLで、INSERTしようとすると 「the table 'table_name' is full ERROR 1114」 と出て登録できなくなりました。 MySQLのバージョンが5.1で、ENGINEは、NDBCLUSTERです。 tmp_table_sizeとmax_heap_table_sizeをデフォルトの16Mから 200Mへ変更してみても同じエラーになります。 パッと見よく分からない質問かもしれませんが、 こんなことが原因の可能性があると思う方がいましたら 教えてください。お願いします。
MySQL_Cluster や NDBCLUSTER をわからずに言うけど 保存用ディレクトリのあるパーティションが いっぱいとかじゃないの? メモリテーブルならどこのサイズなんだろうかな...
tmp_table_sizeとmax_heap_table_sizeはMEMORYストレージエンジンの設定だから NDBとは関係ないパラメータ、のはず Sun Micro.のときはよく宣伝してたけど 正直MySQL Cluster使ってる人は超少ないと思う
>>865 あー、うちでもそれ、tmpテーブル作れない、ってのがあったなぁ。
そんときはええと・・・・・、うーんと、たしかインデックスのサイズも含めたのがtmp_table_sizeだか
heap_sizeだかになって、その見積もりが甘かったのが原因、だったきがします。
username、pointというカラムがあるテーブルがあるとして、 ランキングの順位をつけて出力するSQLはどのようにかいたら うまくいくでしょうか。 3位が4名いても次は4位となるランキングとなってます。 現在のところは select username,point from table order by point asc; でプログラム側で処理しておりますが、全てSQL側で処理ができれば 便利だと思い、質問させていただきました。 よろしくお願いいたします。
871 :
NAME IS NULL :2010/05/12(水) 06:54:41 ID:BasMxRqb
phpMyAdminの情報から MySQL * サーバ: localhost via TCP/IP * サーバのバージョン: 5.1.37 * プロトコルバージョン: 10 * ユーザ: root@localhost * MySQL の文字セット: UTF-8 Unicode (utf8) Web サーバ * Apache/2.2.12 (Win32) DAV/2 mod_ssl/2.2.12 OpenSSL/0.9.8k mod_autoindex_color PHP/5.3.0 * MySQL クライアントのバージョン: 5.1.37 * PHP 拡張: mysqli phpMyAdmin自体はUTF-8になっています。 この状態でphpMyAdminからテーブル作成したところchar型やvarchar型の照合順序がlatin1_swedish_ciになります。 show create tableで見ると、テーブル自体のDEFAULT CHARSETはlatin1となっています。 このままinsert文を実行してchar型に日本語を挿入して、phpMyAdminからselectすると????といった感じに文字化けします。 自前で作ったPHPスクリプト(UTF-8で保存)からアクセスしてphpMyAdminでinsertしたものを取得すると同様に????となります。 次は自前で作ったPHPスクリプト(UTF-8で保存)からテーブルを作成して同様にinsert文で日本語を挿入した場合、 照合順序やテーブルのDEFAULT CHARASETは同様ですが、文字化けせず取得することができました。 phpMyAdminから挿入した項目を見てみると、????にはなってないものの文字化けした字になっています。 さらにPHPスクリプトをShift_JISに保存しなおして同じテーブルに対しinsert文でさらに追加したところ、 追加した部分は正常に見れるものの、UTF-8で保存したときの日本語は文字化けしています。 日本語を挿入する場合、自前のスクリプトから最初に挿入したときの文字コードで挿入し続ければ問題ないことが分かったのですが、 こういうものなのでしょうか? 文字コード関連は複雑で関連ドキュメントを見てもいまいちよく分かりません・・・
872 :
NAME IS NULL :2010/05/12(水) 11:23:43 ID:e1mmKCKP
初歩的とは思いますが、質問です。 作成したビューってのは、元のテーブルが更新されたら、そのタイミングでビューも更新されるって思ってていいのでしょうか? また、year(sysdate())みたいなのを条件に含めてた場合も、日付が変わったタイミングでビューのデータも更新されるって認識で良いのでしょうか?
ビューは普通にSELECT文を発行した結果返ってくる結果を 1つのテーブルに見せかけるだけのもの 当然、データは最新のものになるよ
>>873 ありがとうございます。
SELECTのエイリアスみたいなものですか。
875 :
NAME IS NULL :2010/05/14(金) 15:58:04 ID:UNEfj5/X
質問です。 バージョンは5.1.41です。 ユーザ情報のみのエクスポートをする方法ってありますか? 出来れば「GRANT」の形で出てくると嬉しいんですけど。
876 :
865 :2010/05/14(金) 16:46:55 ID:???
>>866-868 回答ありがとう御座いました。
ちょっと原因の特定ができず、
前任者の作ったシステムで本番環境だったため、
4日ほどかけて全部SQL-serverに移行しました。
質問させてください。 table_main +---------+-----------+ | main_id | main_name | +---------+-----------+ | 1 | NAME1 | | 2 | NAME2 | | 3 | NAME3 | +---------+-----------+ table_sub +---------+----------+ | main_id | have_num | +---------+----------+ | 1 | 10 | | 2 | 10 | | 2 | 20 | | 3 | 10 | | 4 | 20 | +---------+----------+ このようなテーブルがあったとします。 この中から、たとえば「have_numを 10 と 20 両方もつ main_id の main_nameを取得する」 という SQL 文はどのように書けばよいのでしょうか。 サブクエリなど勉強中でいまいち方法が思いつきません。 お詳しいかた教えていただけましたら幸いです。 バージョンは5です。
試してはいない。 SELECT tm.main_name FROM table_main tm, table_sub tsa, table_sub tsb WHERE tsa.have_num = 10 AND tsb.have_num = 20 AND tsa.main_id = tsb.main_id AND tsa.main_id = tm.main_id
>>878 ありがとうございます!
have_numをもつ条件をさらに増やすとなると、
同様に SELECT する同一テーブルがどんどん増えてしまうのですが、
効率をよくするよい方法はありませんよね…?
もしかしたら、この辺でどうだろ?
SQL質疑応答スレ 9問目
http://pc11.2ch.net/test/read.cgi/db/1252492296/6 6 :NAME IS NULL :2009/09/09(水) 19:37:35 ID:???
よくある質問3
(問)
ID HOGE
01 A
01 B
01 C
02 A
03 B
HOGEをAもBもCも持っている、ID:01だけ取り出すにはどうすればよかですか
(答1)
SELECT id
FROM TableName
WHERE hoge in ('A','B','C')
GROUP BY id
HAVING count(DISTINCT hoge) = 3
;
(答2)
select *
from TableName T1
where not exists (select *
from (values 'A', 'B', 'C') T2 (HOGE)
where not exists (select *
from TableName T3
where T1.ID = T3.ID
and T2.HOGE = T3.HOGE
)
)
;
※valuesの部分(Table Value Constructor)はDBMSによって文法がかなり違うので注意
created_tmp_disk_tables が発生したクエリを特定することはできますか?
>>880 ありがとうございます!
このような方法があるのですね。
大変勉強になりました。
さらに、これを発展させて、
table_main
+---------+-----------+
| main_id | main_name |
+---------+-----------+
| 1 | NAME1 |
| 2 | NAME2 |
| 3 | NAME3 |
+---------+-----------+
table_sub
+---------+---------+
| main_id | item_id |
+---------+---------+
| 1 | 1 |
| 2 | 1 |
| 2 | 2 |
| 3 | 1 |
| 4 | 2 |
+---------+---------+
table_item
+---------+-----------+
| item_id | item_name |
+---------+ ----------+
| 1 | アイテム1 |
| 2 | アイテム2 |
+---------+-----------+
「アイテム1 と アイテム2 の両方もつ main_id の main_nameを取得する」
という風に複雑になると、どのようにやればいいのでしょうか。
まず item_name に対応した item_id を取得し、
それを両方もつものを
>>880 の方法で調べる……
という風な方法は思いつきましたが、
1つの SQL 文で記述する方法がわかりませんでした。
お詳しい方教えていただけましたら助かります。
インポートについての質問です。 最新MySql Windows番にて、csvをインポートしようとすると ERROR 1292 (22007): Incorrect datetime value: '2010/05/20 00:00:00 2' for column 'Date' at row 1 と出るのですが、日付データの最後についてる 2 の意味が分かりません。 使用したSQL文は以下のとおりです。 LOAD DATA INFILE "FileName.csv" INTO TABLE TableName FIELDS TERMINATED BY "," ENCLOSED BY '"' LINES TERMINATED BY "/r/n"; Dateはテーブルの最後のフィールドで、他のフィールドのエラーは解決しましたが このエラーだけ解決できません。エディタでcsvを開いたら"でくくられてないのに 取り込んでみたら"でくくられていたりと、いろいろと躓きまくっています・・・ どうか助言をお願い致します。
884 :
883 :2010/05/22(土) 02:14:29 ID:???
自己レスです解決しました。 LINES TERMINATED BY "/r/n"; を LINES TERMINATED BY "\r\n"; に書き換えたところうまくゆきました。 スレ汚し失礼しました。
Mac(10.6)にphpMyAdminを入れたのですが、パスワードがわからず ブラウザからログインができません。どのように設定すれば良いのでしょうか?
パスワードを知ればよろし。 どうしても分からないなら、mysql.userテーブルの該当の ユーザ@マシンのパスワードを消してしまう。 (これはrootとかのパスワードが分からないと出来ないだろうけど)
3306を使ったDB接続ってNAT越えられますか?
もちろん
3306だけ通せばいいのでわりと楽なほう
なるほど ありがとうございます たしかにOracleだと他のポートも必要でしたよね
>891 まぁ確かにセキュリティの問題はありますね お客がやりたい 責任は取るって言われるとやるしかないんです F/Wで元IPを固定したらまぁ簡単に問題は起こらないと思いますが・・・
待ち受けポート番号変えておけばちょっとは安全かもよ
コマンドプロンプトでSelect文を実行すると 件数が多くなると全体を見れ無くなるんですが txtファイルに出力するしかないですか?
コマンドプロンプトの行数を増やす
Pager使う
とりあえず、コマンドプロンプトのプロパティを開いて、レイアウトタブを選択して、 その中の画面バッファのサイズの高さを増やしてみよう。
898 :
NAME IS NULL :2010/05/27(木) 23:23:22 ID:tW/OnXJS
Navicatとかを使ったら?
LIMIT入力すれば?
MYSQLがインストールできましぇん OS:WINDOWS XP MYSQL VER:5.1.45 executeクリックした後に最後のチェックで1045エラーでrootのパス設定出来ないんですけど どうしたらいいでしょうか。 本当すいません。教えて下さい。
executeとrootは小文字だろ
PHP+MySQLで開発しています。 MySQLへのアクセス方法は、PHPからPHPのmysql関数、あるいはPHPのPDOクラスを用いて行う予定です。 できたものは公開したいと思っているのですが、ライセンスをどうすればいいのかよくわかりません。 作るアプリケーションは商用にも使えるアプリケーションになります。 これで開発したアプリケーションのライセンスはGPLになるのでしょうか? できれば制限が緩いBSDやMITあたりにしたいのですが、MySQLを使ってる時点でGPLになってしまいそうで困っています。 MySQL以外にもPostgreSQLとSQLiteにも対応する予定です。 BSDやMITにしたい場合、MySQLの対応ははずすしかないのでしょうか? どのみちソースコードを公開するからGPLでいいじゃんというツッコミはなしでお願いします。
関係ないです
907 :
NAME IS NULL :2010/06/03(木) 18:17:38 ID:zEZNACiR
PHPとMySQLでレンタルバナーみたいなのを作成しています。 会員は2000人ほどですが、1日10万前後のINSERTがあります。 1つのテーブルでアクセスを追加していく形なのですが、 INDEXさえ指定していれば、今後もこのままで大丈夫でしょうか? それとも会員毎にDBを分けた方が良いのでしょうか? 将来を見据えて負荷がかからないような構造をしたいと思っていますので 構造についてアドバイスお願いします。
tableA id | name -------- 1 | aaa 2 | bbb tableB id | tableAid | point ----------------- 1 | 1 | 5 2 | 1 | 8 3 | 2 | 10 3 | 2 | 9 というテーブルで、 tableB.point が9以下の tableA.name を取得したいのですが select tableA.name from tableB inner join tableA on tableB.tableAid = tableA.id where tableB.point < 10 とすると、当然ですが tableA.name が重複してしまいます。 プログラム側で取り除けばいいのですが、なるべくSQLのみで解決したいです。 可能でしょうか?
SELECT DISTINCT 〜
>>907 一日に10万レコードも増加するんだったら、1テーブルでは無理がある
会員毎にテーブルを分けるなりした方がいいだろう
それに加えて、古いレコードを削除するロジックも必須と思うが
というかアクセスログみたいに追加しかしない、複雑な検索を しないものならDB以外の保管手段を考えたほうがいいのでは
DB以外の手法を取るとして、例えばファイルにしちゃうと、 件数が多すぎるから、ファイルオープン後の処理でスクリプトのメモリオーバーでコケる可能性が高いよ
それ以前に設計の見直しが出来ないか? 詳しい仕様を知らんが、 件数をカウントするだけなら件数を保持しておくフィールドをインクリメントしてUPDATEすりゃあいい なんでもかんでもINSERTしてるから肥大化するんでねえの?
>>912 追記の書き込みオンリーで開いてもそうなる?
915 :
907 :2010/06/04(金) 13:45:41 ID:68Ryowuk
>>910-914 みなさんありがとうございます。
テーブルの構成は単純に
id|user_id|banner_id|date
で、「どの会員のバナーがどの日時にアクセスされたか?」を記憶します。
管理画面で範囲検索がしたいので、UPDATEではなくINSERTが必要です。
最低2年以上は保管したいと思っているのですが、
テーブルを分けた方が良いんですかね・・。
JOINして会員データと繋げて管理画面で表示させたいので、
DBを使う方が良いんです。
検索はあんた1人がチマチマやるんだったらどうでもいいんじゃないかな。 動作が遅いとどっかから苦情がくるなら別だけど、これ以上正規化もないだろうからね。 それ以外は単純にINSERTしかしなくて、今問題がないなら余り考えないでもいいようにも思うけど。 INSERTにかかる時間は誰も感じないで済んでるんだろし、一時的にでも今更止められないでしょ。 あとはOLDテーブルみたいなのに心太する仕組みだけ組んどけばいいんじゃないの。
>>914 なる可能性が高い
オープンしたファイルの中身を変数に落としていく際にね
時間は割り切って捨てたら? 俺だったらこうする user_id|banner_id|day | count プライマリーキー:user_id、banner_id、day ようするにday(Y-m-d)毎にcountしちゃえば〜って事 10万件/日の2年分のデータを突っ込んだら、 ユーザー毎にテーブルを分けようとも、JOINで固まる それに、915のテーブルだと、ある会員のアクセス数の取得 SELECT count(*) FROM TBL WHERE user_id= ? AND date < ? AND date <= ? も動かなくなるぞ
MySQL Proxy の話ってここでいいんでしょうか? ぐぐってもあまり情報がでまわっていないもので・・・
>>919 古いデータを定期的にそうやって集計してから切り捨てる、ということならアリだが、
最初からそういうテーブルしか持たないんだったらめんどくさいうえにかえって
遅くなるばかりでメリットがない。
遅くなることはない、10万件を2000件に圧縮できる SELECTもチョイだ 毎日10万件溜まってくテーブルにJOINだとかcount(*)するほうがおかしい
923 :
NAME IS NULL :2010/06/04(金) 22:30:51 ID:ip+eErJw
mysqlを使ったプログラミングをするには、cのapiとjavaのどっちがおすすめ?
924 :
NAME IS NULL :2010/06/05(土) 00:13:35 ID:cbT55XsI
MyISAMについて質問です。 トランザクション機能が使えないMyISAMを採用する場合、 トランザクションを使わないことによる問題点というものに対して、 特別な対策(テーブルを正規化しないとか)をするものなのでしょうか? もしくは、トランザクションを使わないことによって発生する問題点を許容した形でシステム開発をするものなのでしょうか? トランザクションを使わないでシステムを開発することに対してのイメージがわかないので、 MyISAMを使ってどのようにテーブル設計、というか注意事項というかが必要なのか、 そこらへんをご教示いただければと思います。
925 :
NAME IS NULL :2010/06/05(土) 02:43:11 ID:nyGql8Ff
「MM00」みたいな英数字を表示させるにはどういった型で設定すればいいですか? ちなみにVARCHAR(10)でやっても出来ません>< エラー名は ERROR 1054 (42S22): Unknown column 'MM00' in 'field list' です
>>922 insertで済んでいたものがselect→insert/updateになるだろ。
同じ会員のバナーが同時にアクセスされることもあるだろうからロック待ちも
発生するし、厳密にはserializableじゃなきゃならんから、そうしたら毎回
テーブルロックだ。
1時間に平均4000件、1分で70件か。 実際はGTに集中するだろうから10倍見積もるとして・・。 テーブルロック仕様を考えたやつはこの業界で生きていけないぞw
>>925 単にselectするカラム名を間違っているだけなんじゃないの?
>>924 MyISAMの問題はトランザクションがないことよりもクラッシュセーフでないこと。
電源ぶちって切っただけでDBが壊れる。
それでもよいときだけ使う
930 :
NAME IS NULL :2010/06/05(土) 18:04:19 ID:8RarHjRw
なんで、設定フィルの拡張子がmy.cnfとmy.confの2種類あるの?
931 :
NAME IS NULL :2010/06/05(土) 22:36:23 ID:qBJImX+X
SELECT test_tb.id,(test_tb.number+test_tb2.number)AS total FROM test_tb LEFT JOIN test_tb2 USING(id) GROUP BY test_tb.id というSQLがあって、結果が id|total 1 |10 2|NULL となります。id2はtest_tb2.numberが存在しないのでNULLになりますが、 存在しない場合は「0」にするにはどう書けば良いのでしょうか?
932 :
NAME IS NULL :2010/06/05(土) 23:06:32 ID:6EEUsDw0
>>931 mysql固有関数を使うなら
IFNULL((test_tb.number+test_tb2.number),0) AS total
いや、test_tb.numberには値があるかもしれないんだからこうだろ IFNULL(test_tb.number,0) + IFNULL(test_tb2.number,0) AS total
934 :
NAME IS NULL :2010/06/05(土) 23:18:40 ID:qBJImX+X
>>933 質問なんですけど null値が含まれた計算結果はnullになるのでは?
936 :
>>924 :2010/06/06(日) 02:49:52 ID:???
>>929 ありがとうございます。
my.cnfはあまり設定項目が多い印象を受けなかったのですが、 セキュリティに関してはmy.cnfで設定しないのですか?
938 :
NAME IS NULL :2010/06/06(日) 19:34:34 ID:eYBmtmqg
InnoDBで1テーブル/ファイルにしている場合、 既存テーブルにautoextendつけたり、MAX_SIZEつけたりできますか? 有識者の方、よろしくお願いします。
>>938 1) innodb_file_per_tableのときは各テーブル自動でautoextendする
2) InnoDBはそもそもMAX_ROWS効かない
940 :
NAME IS NULL :2010/06/07(月) 11:44:41 ID:7daPAieJ
すみません、質問させてください
WindowsからLinuxに移行しましてMySQLをインストールシヨウと思っているのですが、HP(
http://dev.mysql.com/downloads/mysql/#downloads )のどれをインストールすればいいのか分かりません
自分の持っている本にはmysql?.tar.gzをダウンロードとありますが、rpmしか見当たりません
で、こういうサイト(
http://www.unix-vm.com/centos_4_1.html )を参考にしたのですが、4つもパッケージをダウンロードしています
これはやはり全部ダウンロードしなければいけないのでしょうか?
Windowsだとインストーラ一つだけだったのでどうなのかなぁ、と思いまして
OSはcentOSを使っております
以前yumでMySQLをインストールしたことはあったのですが、バージョンが古かったものでクリーンインストール時に「この際最新版をインストールしよう」と思い立ったのですが分からなくなりまして
宜しくお願いいたします
941 :
NAME IS NULL :2010/06/07(月) 11:48:29 ID:7daPAieJ
ごめんなさい、もう一つ質問がありました centOS5.4を使っている自分の場合、Select PlatformはRed Hat Enterprise Linux 5を選択するのでしょうか? それともLinux - Genericを選択すればいいのでしょうか?
本がどれだかわからんけど、持ってる本の通りにやりたいなら Source Code 選んでGeneric Linuxのとこに*.tar.gzあるよ
"Source Code"すら探せないんだからWindowsに戻るが正解
100万レコードを全文検索する事って出来ますか?
可能
条件がそれだけならまぁ可能だわなぁ
じゃ、1レコード10KB程度の文章があったら?
>>939 ありがとうございます。
file_per_tableだとデフォルトでautoextendつくんですね。
2)についてですが、
質問の仕方がかなり悪くて申し訳なかったです。
MAX_ROWSではなくてautoextendのMAX指定のことをお聞きしたいのです。
既存ファイルのautoextendのMAXサイズを変更できるのでしょうか。
教えていただければ幸いです。
よろしくお願いします。
>>947 可能
ただし1回の検索に20分ぐらいかかるかも
>>941 どちらでもよい
rpmの場合はclient、server、shared、develの4つを入れるのが基本
>>937 my.cnfって最大200項目ぐらいあるけどそれでも少ない?
セキュリティは主にSQLでmysqlデータベースに対して設定する
>>950 また条件後付けで「私のメモリは16GBです」「私のストレージはSSDです」とか言われるぞ。
>>953 その条件だからって、20分が2秒にはならないだろ?
いいえ、死ぬ必要はNight思うわ
夜に死ねと
・後出して条件出して答えてもらう ・単にMySQLの可能性が知りたいだけ どっちだろ?素人だったらそもそも 100万件のデータなんて扱わないはずだから、後者かな。
959 :
NAME IS NULL :2010/06/08(火) 14:18:15 ID:6789QTvE
話はそれるけどいまMysqlの日本語全文検索って senna 以外はどんなのがあるの?
5.1のエクステンションを見たことある 実績とかは知らない
JOIN使うとすんごく遅くなるんですけど仕様ですか? データは1テーブル数10万件 3、4テーブルJOINしてます。
さあ、ジョイナス!!
テーブル構造もSQL文もインデックスも情報なしに、なぁ。
ありがちなのは、N自乗。
でも実際、インデックスを理解しないで使っている人周りに結構居ない?
なんだか分からないが付けると速くなる魔法の機能でしょ、理解してるよ
>>967 はネタだろうが、
実際に使わないインデックスが20くらい付いたテーブルは見たことがある
とりあえず、JOINのキーになっているフィールドはインデックスにしてる
where句ある?
join されるテーブルで where 句使うなら、 複合インデックスで where 句のカラム, 結合カラム とインデックスを張らないとダメだよ。 joinする場合はどっち道 フルJOIN 避けるために件数減らしてからJOINだから、 結合カラムに単体でインデックスを張るのは意味がないと思う。
>>971 結合カラム自体を where で絞り込む場合は?
でもまあ実際コード引継ぎとかすると、 インデックスとクエリ直すだけで速度が100倍とかなるから、 おかげで神みたいな扱いをされて楽。
とあるカラムのインデックス
976 :
NAME IS NULL :2010/06/09(水) 22:13:06 ID:7pAbJT2V
auto_incrementを既存のテーブルに追加したいのですが、 どのようにsqlを書けばいいのかわかりません どなたか、教えてください
ALTER TABLE ADDなのかCHENGEなのか知らんが。
インナーのネイティブアルターか
キュキュキュッ
981 :
NAME IS NULL :2010/06/10(木) 09:07:48 ID:9/rnYsAK
質問させてください。 記号などをInsertするとIncorrect string valueでエラーになる のですがどうしたらいいでしょうか? A,B,Cと複数のDBがあり、Aでしか起きない現象になってます。
記号などって…w 例えばどの文字なのか、いくつか挙げるってのを何故しないの? DB/テーブルの文字コード設定を調べておくってことを 「質問させてください」の前にやってないの? そういやMySQLのバージョンすら分からんな。
983 :
NAME IS NULL :2010/06/10(木) 14:45:20 ID:3agFnNQw
みなさん、どこまで正規化します? 正規化してテーブル分けすぎて後から結合する時に困ります・・。 かといって1つのテーブルで管理すると、レコードが多くなりすぎるし。
正規化って何なのかよくワカンナイ 同じデータが重複しないようにしたりするだけ、1つのテーブルで管理とか逆にどうやってるのか分からない 正規化もワカンナイ
986 :
NAME IS NULL :2010/06/10(木) 16:23:57 ID:3agFnNQw
>>985 例えばECサイト用のDBを構築してレポート表示したい時、
注文レポート、売上げレポート、アクセスレポート
と、3つの用途に関するレポートをテーブル分けしているとします。
これを表示する時、商品IDで結合するわけですが、
物凄くSQL文が長くなり、パフォーマンスに影響が出ないか懸念しています。
テストで、10レコード程度入れて試している分には速いのですが・・。
>>986 ハードウェアのスペック挙げれば解決できるからいいんじゃないの。
俺の場合、データを重複させないようにした方が、二時利用に役立つから極力してるよ。
988 :
NAME IS NULL :2010/06/10(木) 16:31:35 ID:3agFnNQw
>>987 そうですね。SQL文が長くなる=プログラム側の問題は考えないようにします。
>>988 SQL文が長くなってしまってメンテが大変になる場合は、
ある程度区切って結合させてデータを取得し、プログラム側で結合させる事もある。
ま、いろいろ方法はあるよね。
>>987 ハードに逃げるのは馬鹿のやること。
厳しい事を言うが設計がおかしいと考えるべき。
3テーブルを結合したくらいで"ものすごく"SQLが長くなるってのがイメージ付かないんだけど? それにSQLの長さ自体はパフォーマンスには関係ない。 商品IDは主キーなりインデックス張ってあるなりしてるだろうけど、インデックスを使っている限りはDBというものは極めて高速に動く。 データ数が1テーブル10万〜100万オーダー超になるとどうしても遅くなるので、 そういった場合は最後の手段としてハードウェアのスペックを上げる。 3テーブルJOINを使うとメンテ出来ないって?さっさと別業種に転職しろw
メンテ出来ないって誰が書いてるの?
「長い」という基準の違いでしょう
>物凄くSQL文が長くなり、パフォーマンスに影響が出ないか懸念しています。 奇妙な考えだなぁ。
10KB程度のSQLはよくあること
どうせDBの実行所要時間なんて殆どがディスクアクセスでしょ。 いくら長いSQL文たって、そのパースにかかる時間の割合なんぞたかが知れてるんじゃないの。
いろいろとパスワードを設置できるみたいですが、 mysqlにログインする時のパスワードと、databaseにログインする時のパスワードは別なんですか?
パスワードはユーザに設定してるもんだよ。 だから、DBにそのユーザが含まれていたら同じ。
毎日毎日、10万件ものデータいつどうやって作ってるのか、そっちのほうが気になるよ。
普通にサイト運営してたらログとして溜まるだろうが
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。