やりたいこと テーブルにカラム追加するとき、そのカラムがないときだけカラム追加するようにしたい -> 『Duplicate column name』エラーを無視したい Flywayで実行するとき、カラム追加が上手くいってなければFailedにしたいSQL プロシージャを利用する。 DROP PROCEDURE IF EXISTS alter_table_procedure; DELIMITER //CREATE PROCEDURE alter_table_procedure() BEGIN /*SQLEXCEPTIONを無視するように設定 */ DECLARE CONTINUE HANDLER FORSQLEXCEPTION BEGIN END; /* 以下のALTER TABLEで『Duplicate column name』エラーが発生してもプロシージャは正常終了する */ A

結果の先頭から1件を取得する場合、手癖で「LIMIT 0, 1」と書いてしまいがちなんですが。 SELECT * FROMitems LIMIT 0, 1; これに対してレビューで「LIMIT 1 で良くないですか?」というコメントをいただく。 SELECT * FROMitems LIMIT 1; それで何か変わるって話は聞いたことはないけど、コメント貰ったので一応仕ドキュメントを確認。MySQL ::MySQL 5.6 リファレンスマニュアル :: 13.2.9 SELECT 構文 LIMIT 句を使用すると、SELECT ステートメントによって返される行数を制約できます。LIMIT は 1 つまたは 2 つの数値引数を受け取ります。これは、どちらも負ではない整定数である必要があります。ただし、次の例外があります。 準備済みステートメント内では、? プレースホルダマーカーを使用

order by id=xx desc のようにすれば最初に order by id=xx (asc) のようにすれば最後に回す事ができます。 例)id=50のレコードを最初に出したい ※他は順不同mysql> select id from hoge order by id=50 desc; +----+ | id | +----+ | 50 | | 44 | | 59 | (略) | 55 | | 56 | | 70 | +----+例)id=50のレコードを最初に出したい ※他は昇順mysql> select id from hoge order by id=50 desc, id asc; +----+ | id | +----+ | 50 | | 44 | | 45 | (略) | 68 | | 69 | | 70 | +----+例)id=50のレコードを最後に出したい ※他
別テーブルの値を使ってデータの一部の値を洗い替えたい タイトルはSELECT結果でUPDATEですがMySQLではそれができません。 でも「SELECT結果でUPDATE」したい場合って、別テーブルの値を使ってデータの一部の一括して値を洗い替えたい状況がほとんどだと思いますので・・・MySQLのUPDATE構文はそういうことができるようになっている。簡単に言うとデータソースが2つある半分SELECT構文のようなUPDATE文が書ける UPDATE A, B SET A.name = B.name WHERE A.id = B.id こんな感じ。 これだとテーブルA上のレコードとB上のレコードでidが合致するもののnameをBの値で書き換えるということになる。 解釈順番とか考えるとこんがらがってくるが集合として考えると・・・まぁ納得できるかな。Oracleとかはupdateでもse
15時くらいにサーバの1つが突然繋がらなくなり、何かやっちまったのか(例えばデータベースへの過剰なアクセスとか)と思ってサーバを再起動してみたのだけど全然ダメでおろおろしていたら、しれっとこんな告知が出てました。 メンテナンス・障害情報・機能追加|さくらインターネット公式サポートサイト 平素よりさくらインターネットをご利用いただき、誠にありがとうござ います。本日、ご提供サービスにおきまして、以下の通り障害が発生いたしました。 ご利用中のお客様には大変ご迷惑をおかけしておりますことを深くお詫び 申し上げます。 影響範囲 : さくらのVPS 1Gプランの一部IPアドレスが下記の範囲のお客様 219.94.245.15 ~ 219.94.245.134 障害内容 : サーバに接続できなくなる障害が発生しました。 障害によりVPSの意図しない再起動が発生しました。 ああうん、ドンピシャだよさ
共に本連載執筆開始時点での最新安定バージョンですが、ある特定のバージョンに特化した内容を記述する予定はないため、基本的にはPostgreSQLはバージョン8.1系、MySQLはバージョン5.0系の内容としてご理解ください。 また、PostgreSQL/MySQLともに様々なOS上で動作可能ですが、特に断りのない場合はLinux版となります。 PostgreSQLは、1980年頃にUCB(カリフォルニア大学バークレイ校)の研究プロジェクトにて開発されたPOSTGRESというRDBMSが前身です。その後、1995年に同校の大学院生によりPostgres95としてリリースされ、現在の開発チームであるThe PostgreSQL Global Development Groupがこの開発を引き継いだのは1996年です。その際に、名称がPostgreSQLに改名され、ソースコードを公開し、現在もコミ
まあ自分でもびっくりするほどDBまわりの知識がかけていて残念でしょうがないので、知識をつけていこうと思っている今日この頃。 今日、上司と外注先の人が「やっぱり大規模サイトはPostgreSQLよりMySQLだよねー」 みたいなことを言っていて、何となく違和感を覚えたので調べてみた。 何か、どっかでPostgreSQLを使った大規模サイト運用の話があった記憶が…、と思って、本棚をあさって見ると、出てきた。 WEB+DB PRESS Vol.48WEB+DB PRESS編集部 編技術評論社 2008-12-22 売り上げランキング : 208434Amazonで詳しく見る by G-Tools うん、やっぱり、PostgreSQLでもそんなに前面に事例が出てないだけで、けっこう使われてるんじゃん。 興味をもったので、MySQLとPostgreSQLの違いについてもう少し色々と調べてみた。

オープンソースデータベースとしては、MySQLが圧倒的な注目を集めている。MySQLは使いやすいデータベースであり、多くのオープンソースウェブアプリケーションはMySQLを使っている。別の主要なオープンソースデータベースとしてPostgreSQLがあり、広く知られてはいるが、MySQLほどのマインドシェアはない。PostgreSQLがMySQLよりも、よりよいセキュリティ、信頼性、データの完全性を提供していることを考えると、これは不幸なことだ。 しかし、これらの優位点には代償がある。PostgreSQLは設定も利用もやや難しい。PostgreSQLでは、データベース内で提供されるロールと特権に加え、基盤となるOSの特権やセキュリティを活用している。このため、これらの問題について知らない場合、PostgreSQLは使いにくくなる場合がある。ただしこれらのことを知ってしまえば、PostgreS
MySQLの再起動をするときはいつもcondrestartするだけだったのだけど、ふと気になって/etc/init.d/mysqldでコマンドを表示してみたら見たこと無いのがいくつか混じってたのでメモっておくテスト。基本的には、/etc/init.d/mysqldを読んだだけ。 起動コマンドの確認 # /etc/init.d/mysqldUsage: /etc/init.d/mysqld {start|stop|status|restart|condrestart|try-restart|reload|force-reload|startsos} try-restartとか、force-reload、startsosは他のアプリケーションでは見かけない。 起動コマンドの説明 startmysqldプロセスを開始する stopmysqldプロセスを停止する statusmysqldプ
MySQLのmasterとslave 1:1にして参照をslave向けるのってやりたがる人多いみたいだけど、性能たいして上がらない割に可用性落ちるだけだからやめようキャンペーン 2011-06-19 00:16:30 via YoruFukurouMySQL はレプリケーションが簡単に構成できるのですが、時折 master 1台 に対して slave 1台、更新処理は master に、参照は slave に、という構成を目にします。 個人的にはこの構成はお勧めでないと思っているので、その理由を考察してみます。 1. 可用性が落ちる 当然ですが、master, slave のどちらが落ちても影響を受けるために可用性が低下します。 2. 全体の性能がほとんど上がらない master 1台ですべてのクエリを処理する場合と比べて、可用性が落ちる引き換えとして見合った性能向上が得られるか、という
大量のデータをINSERTする場面があってなんとか高速化できないかと思って、 以下の手法を比較してみた。 1件ずつINSERTする トランザクションを使用する 1クエリでまとめてINSERTする テスト環境は以下の通り。MySQL 5.1 テーブルはInnoDB、AUTO_INCREMENT付き(innodb_autoinc_lock_mode=1)PHP 5.3.6 1000件、3000件、5000件、10000件と件数を増やしながらそれぞれ5回ずつ試行して平均を取っている。 使用したコードは最後に。 結果 手法 1,000件 3,000件 5,000件 10,000件 1件ずつINSERTする

InnoDBでINSERT IGNOREを繰り返してたら、レコード数は増えてないのに、 AUTO_INCREMENTだけがガンガン増えててびっくり。おかげでidの値が飛んでる。 なんなんだろうと思ったらこれ、MySQL 5.1.22以降の仕様なんですね。 以下、マニュアルから引用。強調はおいら。 簡単に言えば、このロックモードの重要な効果は、スケーラビリティーの大幅な向上です。このモードは、ステートメントベースのレプリケーションで使用しても安全です。さらに、「従来」 ロックモードの場合と同じく、任意のステートメントによって割り当てられた自動インクリメント番号が「連続」した値になります。このモードでは 「従来」 モードと比較して、ある重要な例外を除けば、自動インクリメントを使用する任意のステートメントでの意味上の「違い」はありません。 その例外とは、ユーザーが複数行 「単純挿入」 の全部では
2つのフィールドをCONCAT()で結合して検索するクエリを書いていたのだけど、どうも検索に失敗するパターンがあるらしく、なんだなんだと思ってたらそう言うことでした。 [MySQL]nullを含むフィールドのconcat | HappyQuality CONCAT(‘A’, ‘B’) → ‘AB’ CONCAT(‘A’, null) → null てっきり、空の文字列として処理されるんだと思ってました。 …ってマニュアルにきちんと書かれてるね。 引数のいずれかかが NULL である場合、CONCAT() は NULL を返します。MySQL ::MySQL 8.0 リファレンスマニュアル :: 12.8 文字列関数および演算子 そうかー。 読んだはずだけど甘かった。 でどうしたらいいかって言うと、IFNULLを使って明示的にnull以外の要素(例えば””)を返すと。 CONCAT(IF
![[MySQL] nullと結合するとnullになる](/image.pl?url=https%3a%2f%2fcdn-ak-scissors.b.st-hatena.com%2fimage%2fsquare%2fc15391ad0b0e62262705e6cf063073ea564a31e1%2fheight%3d288%3bversion%3d1%3bwidth%3d512%2fhttps%253A%252F%252Fnplll.com%252Fwp-content%252Fuploads%252Fsites%252F2%252F2019%252F08%252Flogo-mysql.png&f=jpg&w=240)
MySQLのTipsMySQLで、文字列を結合するときにはCONCAT()関数が使えるが、引数にひとつでもNULLが存在すると返り値がNULLになってしまう。 そこで、NULLがありえるフィールドを結合するときには、そのフィールドをIFNULL()関数で囲ってやるといい。 CONCAT()については「MySQL ::MySQL 4.1 リファレンスマニュアル :: 6.3.2 文字列関数」を参照 IFNULL()については「MySQL ::MySQL 4.1 リファレンスマニュアル :: 6.3.1.4 フロー制御関数」を参照 例 SELECT CONCAT(IFNULL(name_l, "名無しの"), IFNULL(name_f, "権兵衛さん")) as name from users ちなみに数値計算でも計算式にNULLを含むとNULLになってしまうが、同様にIFNULL()
![[MySQL]nullを含むフィールドのconcat](/image.pl?url=https%3a%2f%2fcdn-ak-scissors.b.st-hatena.com%2fimage%2fsquare%2ff030b131c35083706d324b18308f4e9a924a9c82%2fheight%3d288%3bversion%3d1%3bwidth%3d512%2fhttps%253A%252F%252Fhappyquality.com%252Fwp-content%252Fthemes%252Fsimplicity2-child%252Fimages%252Fog-image.jpg&f=jpg&w=240)
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く