最近のトラックバック

  • event (夢茶爺&苦茶爺のPC奮戦備忘録)

おすすめ本

AccRanking

Ad

カテゴリ「MySQL」の10件の記事 Feed

2019年11月19日 (火)

【MySQL】テーブル作成時にカラムにAUTO_INCREMENTを設定する方法について

テーブル作成時に、カラムに主キーとして設定し AUTO_INCREMENT に設定する場合は以下のSQL文で作成できます。

AUTO_INCREMENT の設定されたテーブルへの追加は以下の様に行います。
AUTO_INCREMENT のカラムへ値を設定しなくても、自動で値が設定されていきます。

上の実行からも分かる様に、気をつけたいのは AUTO_INCREMENT のカラムへ途中で値を設定した場合には、その値から AUTO_INCREMENT の値が開始されます。

【MySQL】テーブルカラムに後からAUTO_INCREMENTを設定する方法について

仕事の中、テーブルカラムに主キーは設定していたのですが AUTO_INCREMENT に設定する 必要が出てきたので調べてみました。
以下のSQL文で設定できます。

但し、これは指定された「カラム名」が主キーの設定がされていないとエラーが発生しますので、 以下の様に主キーの設定も合わせて行います。


2019年7月 6日 (土)

【MySQL】ダミーテーブルをUNIONで連結してコード表を作成する方法

MySQL では以下の様にダミーテーブルが使えます。

ダミーテーブルの名前として DUAL を使って SELECT の中のカラムを適当なものが記述できます。 また、 DUAL が無くても動作します。

そこで、コード表とするために、複数のダミーテーブルからの取得を UNION で連結します。
以下に、3個のコードと名前のセットを返すSQLを記します。

普通はコードマスタか何かでデータを持ちますが、 特殊なコードを追加したい場合に、今回の様にダミーテーブルのデータを UNION で連結することがあります。

楽天市場

2019年7月 3日 (水)

【MySQL】ユーザー変数を使ってSELECTに行番号を付加する方法

MySQL ではユーザー変数を定義しそれを SELECT 文のなかで使えます。
以下のSQLの実行は行番号を付加する例です。
SET命令でユーザー変数 @NUM を宣言し、その変数を SELECT で使用しています。

結果表示を見れば、行番号として値が表示されていることが分かります。

SET命令と SELECT文の2行が少し気になるので、 調べてみたら以下の様に、SET命令の部分をダミーのテーブルでの宣言として一体化できます。

GROUP BYORDER BY 句を行った場合にも行番号は付加できる様です。

但し、ユーザ変数の計算部分の処理が1行毎最初に処理される様に思いますが、 クエリー結果でその処理順番が保障されるとも限りません。 この辺りは、個々の場合で調べる必要があります。

楽天市場

【MySQL】カラム名を囲むバッククオートについて

いつも何気なくカラムを使う時には、ほぼカラム名をバッククオート「`」で囲んでいます。
バッククオートは無くても問題は無いのですが、全角文字をカラムにしている場合は 経験上から気持ち悪いのでそうしています。

Oracleなんかだと、バッククオートではなくダブルクォートで囲みます。

以下の記事のテーブルを例にバッククオートでの囲み方を示します。

【MySQL】既に存在するTABLEに複数カラムを位置指定で追加する方法について(ALTER TABLE)


最初の SELECT 文はバッククオート無し TEST1 テーブルの全てを検索していますが、 2番目の SELECT ではカラム及び、テーブル名をバッククオートで囲っています。

バッククオートですが何が有利なのかと言えば、カラム名が予約語でもOKなのです。 (普通は予約語をカラム名にしませんが)
以下の例を見て下さい。 カラム名には相応しくない INSERT ですが、取り敢えずテーブルに追加して SELECT してみます。

結果は問題無く出来る様です。(しかし、予約語はいけませんが。)

バッククオートは少し面倒くさいのですが、カラム名などをはっきりと区別できる点もありますし、 使った方が良いと思います。 (テーブルの別名にもバッククオートは付加できます)

楽天市場

【MySQL】既に存在するTABLEに複数カラムを位置指定で追加する方法について(ALTER TABLE)

仕様変更などでテーブルのカラム追加が発生しますが、 この時複数のカラムを位置指定で行う方法について記します。

先ずは、最初に例となるテーブルを以下の様に作成します。 このテーブルはテストなので、特に主キーなどは追加しません。


このテーブルの COL2 の次に ADDCOL1ADDCOL2 と言う名前で VARCHAR 属性で追加します。


これを実行してテーブルを見てみると、カラムが追加されたことが分かります。

楽天市場

2019年6月 1日 (土)

【MySQL】文字列カラムに追加で更新する方法について(CONCAT)

VARCHARTEXT で定義されている文字列カラムに対して、文字列の追加更新を行う場合には 以下の様に CONCAT 関数を使って更新を行います。


この方法で一見よさそうなのですが、 更新対象のカラムが元々 NULL の場合には結果として NULL と更新されてしまいます。

CONCAT 関数は連結するデータが NULL の場合には NULL を返すため、 結果として対象のカラムが NULL に更新されます。

そこで以下の様に IFNULL 関数で NULL の場合には空文字('')の判定を行ってやります。


これで何とか目的の更新処理が行えると思います。


2018年10月19日 (金)

【MySQL】UNION MINUS が無いので、代わりに NOT EXISTS を使う方法について

MySQLUNION MINUS が出来ないので、代わりに NOT EXISTS を使って実現します。
前回の記事の ユーザ変数を使って連番や、連続日付を取得する方法について のSQL文を参考にします。

8個の連続日付から、途中の4件を差し引く例を以下に示します。
最初の方のFROM句の中は、10日分の連続日付を生成するテーブル定義になります。
また、 NOT EXISTS 句のFROM句の中は、途中の日付から4日分の連続日付を生成するテーブルとなります。
それぞれのテーブルを日付カラムでリンクを行うと、出力として4日分の日付が中抜けした結果になります。
実行結果は以下の様になります。


【MySQL】ユーザ変数を使って連番や、連続日付を取得する方法について

仕事の中で連番のみの仮想的なテーブルがほしい場合があったので、調べてみたところ、その解決方法としてユーザ変数を使って SQL文1個でできる様なので、その件を記します。

SQL文は以下の様に、2個のSELECT文をUNIONで連結しています。 最初のSELECT文でユーザ変数 @num を初期化し、2個目のSELECT文で @num を順次1加算し、表示することになります。 さらに LIMIT句 で何個までを生成するのかを指定します。
ただ、FROM句には実際のテーブルが必要ですので、あらかじめ TEST と命名したテーブルを作成しておきました。 TEST の中身はなんでもいいのですが、とにかく欲しい連番までのレコード(行)が必要です。
なるべくレコード数が多い方がいいのですが、特別に TEST などというテーブルを作成しなくても MySQLインストール時に生成されるシステムDBのテーブルを使ってもできます。

いろんな方のサイトを見ると、`information_schema`.COLUMNS を使っているのを多く見かけます。 実際このテーブルのレコード数は10万件以上ありますので、これを使うのがいいのではと思います。
実行結果は以下の様になります。
また、この方法を応用して、連続日付の生成を行います。以下のSQLを見て下さい。 @num の部分を @dat として日付発生させるように変更しています。
実行結果は以下の様になります。


2011年4月27日 (水)

MySQLのdualダミーテーブル

Oraleに存在するダミーテーブルDUALですが、MySQLにも存在します。
でもMySQLのマニュアルを見ますと以下の様な記述があります。

「バージョン 4.1.0 以降では、どのテーブルも参照されない状況において、 ダミーテーブル名として DUAL を指定することができる。 これはもっぱら互換性を考慮した機能である。 一部の他のサーバではこの構文が必要となる。」

以下のSQLはどちらを使っても同じ結果が得られます。

Oracleを使ってきた私が、MySQLを使うとDUALを使いたくなってしまいます。
FROM句が無いのがどうも気持ち悪いからで、特に意味はありませんが、みなさんはどうなのでしょうか。

尚、上のSQLの実行はWindowsXPでXAMPPをインストールしてコマンドラインからMySQLを実行しています。
コマンドラインからの実行は以下のコマンドにより実行します。

c:\xampp\mysql\bin\mysql -u root -p


楽天市場