MySQL-クイックガイド
データベースとは何ですか?
データベースは、データのコレクションを格納する別個のアプリケーションです。各データベースには、保持するデータを作成、アクセス、管理、検索、および複製するための1つ以上の個別のAPIがあります。
ファイルシステム上のファイルやメモリ内の大きなハッシュテーブルなど、他の種類のデータストアも使用できますが、これらのタイプのシステムでは、データのフェッチと書き込みはそれほど高速で簡単ではありません。
現在、私たちはリレーショナルデータベース管理システム(RDBMS)を使用して、大量のデータを保存および管理しています。これは、すべてのデータが異なるテーブルに格納され、主キーまたは次のような他のキーを使用して関係が確立されるため、リレーショナルデータベースと呼ばれます。Foreign Keys。
A Relational DataBase Management System (RDBMS) はソフトウェアです-
テーブル、列、およびインデックスを使用してデータベースを実装できます。
さまざまなテーブルの行間の参照整合性を保証します。
インデックスを自動的に更新します。
SQLクエリを解釈し、さまざまなテーブルの情報を組み合わせます。
RDBMSの用語
MySQLデータベースシステムの説明に進む前に、データベースに関連するいくつかの定義を修正しましょう。
Database −データベースは、関連データを含むテーブルのコレクションです。
Table−テーブルはデータを含む行列です。データベース内のテーブルは、単純なスプレッドシートのように見えます。
Column − 1つの列(データ要素)には、同じ種類のデータ(たとえば、列の郵便番号)が含まれます。
Row −行(=タプル、エントリー、またはレコード)は、関連データのグループです。たとえば、1つのサブスクリプションのデータです。
Redundancy −システムを高速化するために、データを2回冗長に保存します。
Primary Key−主キーは一意です。キー値は、1つのテーブルで2回出現することはできません。キーを使用すると、1行しか見つかりません。
Foreign Key −外部キーは、2つのテーブル間のリンクピンです。
Compound Key −複合キー(複合キー)は、1つの列が十分に一意ではないため、複数の列で構成されるキーです。
Index −データベース内のインデックスは、本の裏にあるインデックスに似ています。
Referential Integrity −参照整合性は、外部キー値が常に既存の行を指すようにします。
MySQLデータベース
MySQLは、多くの中小企業で使用されている高速で使いやすいRDBMSです。MySQLは、スウェーデンの企業であるMySQL ABによって開発、販売、およびサポートされています。MySQLは、多くの正当な理由により非常に人気が高まっています-
MySQLはオープンソースライセンスの下でリリースされています。したがって、それを使用するために支払うものは何もありません。
MySQLはそれ自体が非常に強力なプログラムです。これは、最も高価で強力なデータベースパッケージの機能の大部分を処理します。
MySQLは、よく知られているSQLデータ言語の標準形式を使用します。
MySQLは、多くのオペレーティングシステムで動作し、PHP、PERL、C、C ++、JAVAなどの多くの言語で動作します。
MySQLは非常に高速に動作し、大きなデータセットでも正常に動作します。
MySQLは、Web開発で最も高く評価されている言語であるPHPに非常に適しています。
MySQLは、テーブル内で最大5,000万行以上の大規模なデータベースをサポートします。テーブルのデフォルトのファイルサイズ制限は4GBですが、これを(オペレーティングシステムが処理できる場合)理論上の制限である800万テラバイト(TB)まで増やすことができます。
MySQLはカスタマイズ可能です。オープンソースのGPLライセンスにより、プログラマーはMySQLソフトウェアを自分の特定の環境に合うように変更できます。
あなたが始める前に
このチュートリアルを開始する前に、PHPおよびHTMLチュートリアルでカバーされている情報の基本的な知識を持っている必要があります。
このチュートリアルでは、PHP環境でのMySQLの使用に重点を置いています。このチュートリアルに記載されている多くの例は、PHPプログラマーに役立ちます。
参考までに、PHPチュートリアルを確認することをお勧めします。
MySQLのすべてのダウンロードは、MySQLDownloadsにあります。のバージョン番号を選択してくださいMySQL Community Server これは、実行するプラットフォームとともに必要です。
Linux / UNIXへのMySQLのインストール
LinuxシステムにMySQLをインストールするための推奨される方法は、RPMを使用することです。MySQL ABは、次のRPMをWebサイトからダウンロードできるようにします-
MySQL − MySQLデータベースサーバーは、データベースとテーブルを管理し、ユーザーアクセスを制御し、SQLクエリを処理します。
MySQL-client −サーバーへの接続とサーバーとの対話を可能にするMySQLクライアントプログラム。
MySQL-devel −MySQLを使用する他のプログラムをコンパイルするときに便利なライブラリとヘッダーファイル。
MySQL-shared −MySQLクライアントの共有ライブラリ。
MySQL-bench −MySQLデータベースサーバーのベンチマークおよびパフォーマンステストツール。
ここにリストされているMySQLRPMは、すべて SuSE Linux system、ただし、通常は他のLinuxバリアントでも問題なく動作します。
ここで、インストールを続行するには、以下の手順に従う必要があります-
を使用してシステムにログインします root ユーザー。
RPMを含むディレクトリに切り替えます。
次のコマンドを実行して、MySQLデータベースサーバーをインストールします。イタリック体のファイル名をRPMのファイル名に置き換えることを忘れないでください。
[root@host]# rpm -i MySQL-5.0.9-0.i386.rpm
上記のコマンドは、MySQLサーバーのインストール、MySQLのユーザーの作成、必要な構成の作成、およびMySQLサーバーの自動起動を処理します。
MySQL関連のすべてのバイナリは/ usr / binおよび/ usr / sbinにあります。すべてのテーブルとデータベースは/ var / lib / mysqlディレクトリに作成されます。
次のコードボックスには、残りのRPMを同じ方法でインストールするためのオプションですが推奨される手順があります-
[root@host]# rpm -i MySQL-client-5.0.9-0.i386.rpm
[root@host]# rpm -i MySQL-devel-5.0.9-0.i386.rpm
[root@host]# rpm -i MySQL-shared-5.0.9-0.i386.rpm
[root@host]# rpm -i MySQL-bench-5.0.9-0.i386.rpm
WindowsへのMySQLのインストール
MySQLがインストーラーにきちんとパッケージ化されているため、Windowsのどのバージョンへのデフォルトのインストールも以前よりもはるかに簡単になりました。インストーラーパッケージをダウンロードし、どこかで解凍して、setup.exeファイルを実行するだけです。
デフォルトのインストーラーsetup.exeは、簡単なプロセスを順を追って説明し、デフォルトでは、C:\ mysqlの下にすべてをインストールします。
初めてコマンドプロンプトからサーバーを起動して、サーバーをテストします。の場所に移動しますmysqld server これはおそらくC:\ mysql \ binであり、タイプ-
mysqld.exe --console
NOTE − NTを使用している場合は、mysqld.exeの代わりにmysqld-nt.exeを使用する必要があります。
すべてがうまくいけば、起動と起動に関するいくつかのメッセージが表示されます InnoDB。そうでない場合は、権限の問題がある可能性があります。データベースプロセスが実行されているすべてのユーザー(おそらくMySQL)が、データを保持するディレクトリにアクセスできることを確認してください。
MySQLはスタートメニューに自分自身を追加しません。また、サーバーを停止するための特に優れたGUIの方法もありません。したがって、mysqld実行可能ファイルをダブルクリックしてサーバーを起動する傾向がある場合は、mysqladmin、タスクリスト、タスクマネージャー、またはその他のWindows固有の手段を使用して手動でプロセスを停止することを忘れないでください。
MySQLのインストールの確認
MySQLが正常にインストールされた後、ベーステーブルが初期化され、サーバーが起動しました。いくつかの簡単なテストを使用して、すべてが正常に機能していることを確認できます。
mysqladminユーティリティを使用してサーバーステータスを取得します
使用する mysqladminサーバーのバージョンを確認するためのバイナリ。このバイナリは、Linuxでは/ usr / binに、WindowsではC:\ mysql \ binにあります。
[root@host]# mysqladmin --version
Linuxでは次のような結果になります。インストールによって異なる場合があります-
mysqladmin Ver 8.23 Distrib 5.0.9-0, for redhat-linux-gnu on i386
このようなメッセージが表示されない場合は、インストールに問題がある可能性があり、それを修正するには何らかの支援が必要です。
MySQLクライアントを使用して簡単なSQLコマンドを実行する
MySQLクライアントを介してMySQLサーバーに接続するには、 mysqlコマンド。現時点では、デフォルトで空白に設定されているため、パスワードを入力する必要はありません。
次のコマンドを使用できます-
[root@host]# mysql
mysql>プロンプトで報われるはずです。これで、MySQLサーバーに接続し、次のようにmysql>プロンプトですべてのSQLコマンドを実行できます。
mysql> SHOW DATABASES;
+----------+
| Database |
+----------+
| mysql |
| test |
+----------+
2 rows in set (0.13 sec)
インストール後の手順
MySQLには、ルートMySQLユーザーの空白のパスワードが付属しています。データベースとクライアントを正常にインストールしたらすぐに、次のコードブロックに示すようにrootパスワードを設定する必要があります-
[root@host]# mysqladmin -u root password "new_password";
MySQLサーバーに接続するには、次のコマンドを使用する必要があります-
[root@host]# mysql -u root -p
Enter password:*******
UNIXユーザーもMySQLディレクトリをPATHに入れたいと思うので、コマンドラインクライアントを使用するたびにフルパスを入力し続ける必要はありません。
bashの場合、次のようになります-
export PATH = $PATH:/usr/bin:/usr/sbin
起動時にMySQLを実行する
起動時にMySQLサーバーを実行する場合は、/ etc /rc.localファイルに次のエントリがあることを確認してください。
/etc/init.d/mysqld start
また、/ etc / init.d /ディレクトリにmysqldバイナリが必要です。
MySQLサーバーの実行とシャットダウン
まず、MySQLサーバーが実行されているかどうかを確認します。次のコマンドを使用して確認できます-
ps -ef | grep mysqld
MySqlが実行されている場合は、次のように表示されます。 mysqld結果にリストされているプロセス。サーバーが実行されていない場合は、次のコマンドを使用してサーバーを起動できます-
root@host# cd /usr/bin
./safe_mysqld &
ここで、すでに実行中のMySQLサーバーをシャットダウンする場合は、次のコマンドを使用してシャットダウンできます。
root@host# cd /usr/bin
./mysqladmin -u root -p shutdown
Enter password: ******
MySQLユーザーアカウントの設定
MySQLに新しいユーザーを追加するには、に新しいエントリを追加する必要があります。 user データベース内のテーブル mysql。
次のプログラムは、新しいユーザーを追加する例です。 guest SELECT、INSERT、およびUPDATE権限とパスワード guest123; SQLクエリは-
root@host# mysql -u root -p
Enter password:*******
mysql> use mysql;
Database changed
mysql> INSERT INTO user
(host, user, password,
select_priv, insert_priv, update_priv)
VALUES ('localhost', 'guest',
PASSWORD('guest123'), 'Y', 'Y', 'Y');
Query OK, 1 row affected (0.20 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 1 row affected (0.01 sec)
mysql> SELECT host, user, password FROM user WHERE user = 'guest';
+-----------+---------+------------------+
| host | user | password |
+-----------+---------+------------------+
| localhost | guest | 6f8c114b58f2ce9e |
+-----------+---------+------------------+
1 row in set (0.00 sec)
新しいユーザーを追加するときは、MySQLが提供するPASSWORD()関数を使用して新しいパスワードを暗号化することを忘れないでください。上記の例でわかるように、パスワードmypassは6f8c114b58f2ce9eに暗号化されています。
FLUSHPRIVILEGESステートメントに注意してください。これは、許可テーブルを再ロードするようにサーバーに指示します。これを使用しない場合、少なくともサーバーが再起動されるまで、新しいユーザーアカウントを使用してMySQLに接続することはできません。
INSERTクエリの実行時にユーザーテーブルの次の列の値を「Y」に設定して、新しいユーザーに他の権限を指定することも、後でUPDATEクエリを使用してそれらを更新することもできます。
- Select_priv
- Insert_priv
- Update_priv
- Delete_priv
- Create_priv
- Drop_priv
- Reload_priv
- Shutdown_priv
- Process_priv
- File_priv
- Grant_priv
- References_priv
- Index_priv
- Alter_priv
ユーザーアカウントを追加するもう1つの方法は、GRANTSQLコマンドを使用することです。次の例では、ユーザーを追加しますzara パスワード付き zara123 特定のデータベースの場合、 TUTORIALS。
root@host# mysql -u root -p password;
Enter password:*******
mysql> use mysql;
Database changed
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
-> ON TUTORIALS.*
-> TO 'zara'@'localhost'
-> IDENTIFIED BY 'zara123';
これにより、MySQLデータベーステーブルに次のようなエントリも作成されます。 user。
NOTE − SQLコマンドの最後にセミコロン(;)を付けるまで、MySQLはコマンドを終了しません。
/etc/my.cnfファイル構成
ほとんどの場合、このファイルには触れないでください。デフォルトでは、次のエントリがあります-
[mysqld]
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
[mysql.server]
user = mysql
basedir = /var/lib
[safe_mysqld]
err-log = /var/log/mysqld.log
pid-file = /var/run/mysqld/mysqld.pid
ここで、エラーログに別のディレクトリを指定できます。指定しない場合は、このテーブルのエントリを変更しないでください。
管理MySQLコマンド
これは、MySQLデータベースを操作するために時々使用する重要なMySQLコマンドのリストです-
USE Databasename −これは、MySQLワークエリア内のデータベースを選択するために使用されます。
SHOW DATABASES − MySQLDBMSがアクセスできるデータベースを一覧表示します。
SHOW TABLES − useコマンドでデータベースが選択されると、データベース内のテーブルが表示されます。
SHOW COLUMNS FROM tablename: テーブルの属性、属性のタイプ、キー情報、NULLが許可されているかどうか、デフォルト、およびその他の情報を表示します。
SHOW INDEX FROM tablename − PRIMARY KEYを含む、テーブル上のすべてのインデックスの詳細を表示します。
SHOW TABLE STATUS LIKE tablename\G − MySQLDBMSのパフォーマンスと統計の詳細を報告します。
次の章では、MySQLでPHP構文がどのように使用されるかについて説明します。
MySQLは、PERL、C、C ++、JAVA、PHPなどのさまざまなプログラミング言語の組み合わせで非常にうまく機能します。これらの言語の中で、PHPはそのWebアプリケーション開発機能のために最も人気のある言語です。
このチュートリアルでは、PHP環境でのMySQLの使用に重点を置いています。MySQL with PERLに興味がある場合は、PERLチュートリアルを読むことを検討してください。
PHPは、MySQLデータベースにアクセスし、MySQLデータベース内のデータレコードを操作するためのさまざまな関数を提供します。他のPHP関数を呼び出すのと同じ方法でPHP関数を呼び出す必要があります。
MySQLで使用するPHP関数の一般的な形式は次のとおりです。
mysql_function(value,value,...);
関数名の2番目の部分は関数に固有であり、通常は関数の機能を説明する単語です。以下は、チュートリアルで使用する2つの関数です。
mysqli_connect($connect);
mysqli_query($connect,"SQL statement");
次の例は、MySQL関数を呼び出すためのPHPの一般的な構文を示しています。
<html>
<head>
<title>PHP with MySQL</title>
</head>
<body>
<?php
$retval = mysql_function(value, [value,...]);
if( !$retval ) {
die ( "Error: a related error message" );
}
// Otherwise MySQL or PHP Statements
?>
</body>
</html>
次の章から、PHPとともにすべての重要なMySQL機能を確認します。
MySQLバイナリを使用したMySQL接続
MySQLデータベースを確立するには mysql コマンドプロンプトでバイナリ。
例
コマンドプロンプトからMySQLサーバーに接続する簡単な例を次に示します-
[root@host]# mysql -u root -p
Enter password:******
これにより、任意のSQLコマンドを実行できるmysql>コマンドプロンプトが表示されます。以下は上記のコマンドの結果です-
次のコードブロックは、上記のコードの結果を示しています-
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2854760 to server version: 5.0.9
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
上記の例では、 rootユーザーとして使用できますが、他のユーザーも使用できます。すべてのユーザーは、そのユーザーに許可されているすべてのSQL操作を実行できます。
MySQLデータベースからいつでも切断できます。 exit mysql>プロンプトでのコマンド。
mysql> exit
Bye
PHPスクリプトを使用したMySQL接続
PHPは提供します mysql_connect()データベース接続を開く関数。この関数は5つのパラメーターを受け取り、成功した場合はMySQLリンク識別子を返し、失敗した場合はFALSEを返します。
構文
connection mysql_connect(server,user,passwd,new_link,client_flag);
シニア番号 | パラメータと説明 |
---|---|
1 | server オプション-データベースサーバーを実行しているホスト名。指定しない場合、デフォルト値は次のようになります。localhost:3306。 |
2 | user オプション-データベースにアクセスするユーザー名。指定しない場合、デフォルトはサーバープロセスを所有するユーザーの名前になります。 |
3 | passwd オプション-データベースにアクセスするユーザーのパスワード。指定しない場合、デフォルトは空のパスワードになります。 |
4 | new_link オプション-同じ引数を使用してmysql_connect()が2回呼び出された場合、新しい接続は確立されません。代わりに、すでに開かれている接続の識別子が返されます。 |
5 | client_flags オプション-次の定数の組み合わせ-
|
別のPHP関数を使用して、いつでもMySQLデータベースから切断できます。 mysql_close()。この関数は単一のパラメーターを取ります。これは、mysql_connect() 関数。
構文
bool mysql_close ( resource $link_identifier );
リソースが指定されていない場合、最後に開かれたデータベースが閉じられます。この関数は、接続を正常に閉じるとtrueを返し、それ以外の場合はfalseを返します。
例
次の例を試して、MySQLサーバーに接続してください-
<html>
<head>
<title>Connecting MySQL Server</title>
</head>
<body>
<?php
$dbhost = 'localhost:3306'; $dbuser = 'guest';
$dbpass = 'guest123'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) {
die('Could not connect: ' . mysql_error());
}
echo 'Connected successfully';
mysql_close($conn);
?>
</body>
</html>
mysqladminを使用してデータベースを作成する
MySQLデータベースを作成または削除するには、特別な権限が必要になります。したがって、rootユーザーにアクセスできると仮定すると、mysqlを使用して任意のデータベースを作成できます。mysqladmin バイナリ。
例
これは、というデータベースを作成する簡単な例です。 TUTORIALS −
[root@host]# mysqladmin -u root -p create TUTORIALS
Enter password:******
これにより、チュートリアルと呼ばれるMySQLデータベースが作成されます。
PHPスクリプトを使用してデータベースを作成する
PHPは mysql_queryMySQLデータベースを作成または削除する関数。この関数は2つのパラメーターを取り、成功した場合はTRUEを返し、失敗した場合はFALSEを返します。
構文
bool mysql_query( sql, connection );
シニア番号 | パラメータと説明 |
---|---|
1 | sql 必須-MySQLデータベースを作成または削除するためのSQLクエリ |
2 | connection オプション-指定されていない場合、mysql_connectによって最後に開かれた接続が使用されます。 |
例
データベースを作成する次の例-
<html>
<head>
<title>Creating MySQL Database</title>
</head>
<body>
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root'; $dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) { die('Could not connect: ' . mysql_error()); } echo 'Connected successfully<br />'; $sql = 'CREATE DATABASE TUTORIALS';
$retval = mysql_query( $sql, $conn ); if(! $retval ) {
die('Could not create database: ' . mysql_error());
}
echo "Database TUTORIALS created successfully\n";
mysql_close($conn);
?>
</body>
</html>
mysqladminを使用してデータベースを削除します
MySQLデータベースを作成または削除するには、特別な権限が必要になります。したがって、rootユーザーにアクセスできると仮定すると、mysqlを使用して任意のデータベースを作成できます。mysqladmin バイナリ。
データベースで使用可能なすべてのデータが失われるため、データベースを削除するときは注意してください。
前章で作成したデータベース(チュートリアル)を削除する例です-
[root@host]# mysqladmin -u root -p drop TUTORIALS
Enter password:******
これにより警告が表示され、このデータベースを本当に削除するかどうかが確認されます。
Dropping the database is potentially a very bad thing to do.
Any data stored in the database will be destroyed.
Do you really want to drop the 'TUTORIALS' database [y/N] y
Database "TUTORIALS" dropped
PHPスクリプトを使用してデータベースを削除する
PHPは mysql_queryMySQLデータベースを作成または削除する関数。この関数は2つのパラメーターを取り、成功した場合はTRUEを返し、失敗した場合はFALSEを返します。
構文
bool mysql_query( sql, connection );
シニア番号 | パラメータと説明 |
---|---|
1 | sql 必須-MySQLデータベースを作成または削除するためのSQLクエリ |
2 | connection オプション-指定されていない場合、mysql_connectによって最後に開かれた接続が使用されます。 |
例
次の例を試して、データベースを削除してください-
<html>
<head>
<title>Deleting MySQL Database</title>
</head>
<body>
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root'; $dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) { die('Could not connect: ' . mysql_error()); } echo 'Connected successfully<br />'; $sql = 'DROP DATABASE TUTORIALS';
$retval = mysql_query( $sql, $conn ); if(! $retval ) {
die('Could not delete database: ' . mysql_error());
}
echo "Database TUTORIALS deleted successfully\n";
mysql_close($conn);
?>
</body>
</html>
WARNING− PHPスクリプトを使用してデータベースを削除している間、確認を求めるプロンプトは表示されません。したがって、MySQLデータベースを削除するときは注意してください。
MySQLサーバーに接続したら、使用するデータベースを選択する必要があります。これは、MySQLサーバーで使用可能なデータベースが複数ある可能性があるためです。
コマンドプロンプトからMySQLデータベースを選択する
mysql>プロンプトからデータベースを選択するのは非常に簡単です。SQLコマンドを使用できますuse データベースを選択します。
例
これは、というデータベースを選択する例です。 TUTORIALS −
[root@host]# mysql -u root -p
Enter password:******
mysql> use TUTORIALS;
Database changed
mysql>
これで、チュートリアルデータベースが選択され、以降のすべての操作がチュートリアルデータベースで実行されます。
NOTE−すべてのデータベース名、テーブル名、テーブルフィールド名では、大文字と小文字が区別されます。したがって、SQLコマンドを実行するときは、適切な名前を使用する必要があります。
PHPスクリプトを使用したMySQLデータベースの選択
PHPは機能を提供します mysql_select_dbデータベースを選択します。成功した場合はTRUEを返し、失敗した場合はFALSEを返します。
構文
bool mysql_select_db( db_name, connection );
シニア番号 | パラメータと説明 |
---|---|
1 | db_name 必須-選択するMySQLデータベース名 |
2 | connection オプション-指定されていない場合、mysql_connectによって最後に開かれた接続が使用されます。 |
例
これは、データベースを選択する方法を示す例です。
<html>
<head>
<title>Selecting MySQL Database</title>
</head>
<body>
<?php
$dbhost = 'localhost:3036';
$dbuser = 'guest'; $dbpass = 'guest123';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) { die('Could not connect: ' . mysql_error()); } echo 'Connected successfully'; mysql_select_db( 'TUTORIALS' ); mysql_close($conn);
?>
</body>
</html>
テーブル内のフィールドを適切に定義することは、データベースの全体的な最適化にとって重要です。実際に使用する必要があるフィールドのタイプとサイズのみを使用する必要があります。たとえば、2文字しか使用しないことがわかっている場合は、10文字幅のフィールドを定義しないでください。これらのタイプのフィールド(または列)は、データ型の後にデータ型とも呼ばれます。type of data これらのフィールドに保存します。
MySQLは、3つのカテゴリに分類される多くの異なるデータ型を使用します-
- Numeric
- 日時
- 文字列タイプ。
それでは、それらについて詳しく説明しましょう。
数値データ型
MySQLはすべての標準ANSISQL数値データ型を使用するため、別のデータベースシステムからMySQLを使用する場合、これらの定義は見覚えがあるでしょう。
次のリストは、一般的な数値データ型とその説明を示しています-
INT−符号付きまたは符号なしの通常サイズの整数。符号付きの場合、許容範囲は-2147483648〜2147483647です。符号なしの場合、許容範囲は0〜4294967295です。最大11桁の幅を指定できます。
TINYINT−符号付きまたは符号なしの非常に小さい整数。符号付きの場合、許容範囲は-128〜127です。符号なしの場合、許容範囲は0〜255です。最大4桁の幅を指定できます。
SMALLINT−符号付きまたは符号なしの整数。符号付きの場合、許容範囲は-32768〜32767です。符号なしの場合、許容範囲は0〜65535です。最大5桁の幅を指定できます。
MEDIUMINT−符号付きまたは符号なしが可能な中サイズの整数。符号付きの場合、許容範囲は-8388608〜8388607です。符号なしの場合、許容範囲は0〜16777215です。最大9桁の幅を指定できます。
BIGINT−符号付きまたは符号なしの整数。符号付きの場合、許容範囲は-9223372036854775808〜9223372036854775807です。符号なしの場合、許容範囲は0〜18446744073709551615です。最大20桁の幅を指定できます。
FLOAT(M,D)−符号なしにできない浮動小数点数。表示長(M)と小数点以下の桁数(D)を定義できます。これは必須ではなく、デフォルトで10,2になります。ここで、2は小数点以下の桁数、10は合計桁数(小数点以下を含む)です。FLOATの場合、10進精度は24か所になります。
DOUBLE(M,D)−符号なしにできない倍精度浮動小数点数。表示長(M)と小数点以下の桁数(D)を定義できます。これは必須ではなく、デフォルトで16,4になります。ここで、4は小数点以下の桁数です。10進数の精度はDOUBLEで53か所になります。REALはDOUBLEの同義語です。
DECIMAL(M,D)−符号なしにできない、パックされていない浮動小数点数。アンパックされた小数では、各小数は1バイトに対応します。表示長(M)と小数点以下の桁数(D)を定義する必要があります。NUMERICはDECIMALの同義語です。
日付と時刻のタイプ
MySQLの日付と時刻のデータ型は次のとおりです-
DATE− YYYY-MM-DD形式の日付、1000-01-01から9999-12-31の間。例えば、12月30日目、1973年は1973年12月30日として格納されます。
DATETIME− YYYY-MM-DD HH:MM:SS形式の日付と時刻の組み合わせ。1000-01-0100:00:00から9999-12-3123:59:59まで。例えば、12月30日の午後3:30番目、1973年は1973年12月30日午前15時30分00秒として格納されます。
TIMESTAMP-真夜中の間のタイムスタンプ、1月1日目のみの数字の間にハイフンなしで、1970および2037でいつか前のDATETIMEフォーマットのようなこのルックス、。12月30日午後3:30番目、1973 19731230153000(YYYYMMDDHHMMSS)として記憶されます。
TIME −時刻をHH:MM:SS形式で保存します。
YEAR(M)−年を2桁または4桁の形式で格納します。長さが2として指定されている場合(たとえば、YEAR(2))、YEARは1970から2069(70から69)の間です。長さが4として指定されている場合、YEARは1901から2155になります。デフォルトの長さは4です。
文字列タイプ
数値と日付のタイプは楽しいですが、保存するほとんどのデータは文字列形式になります。このリストでは、MySQLの一般的な文字列データ型について説明します。
CHAR(M)− 1〜255文字の長さの固定長文字列(たとえば、CHAR(5))。格納時に指定された長さまでスペースが右に埋め込まれます。長さを定義する必要はありませんが、デフォルトは1です。
VARCHAR(M)−長さが1〜255文字の可変長ストリング。たとえば、VARCHAR(25)。VARCHARフィールドを作成するときに長さを定義する必要があります。
BLOB or TEXT−最大長65535文字のフィールド。BLOBは「バイナリラージオブジェクト」であり、画像やその他の種類のファイルなど、大量のバイナリデータを格納するために使用されます。TEXTとして定義されたフィールドも、大量のデータを保持します。2つの違いは、保存されたデータの並べ替えと比較がcase sensitive on BLOBs and are not case sensitive in TEXT fields. You do not specify a length with BLOB or TEXT.
TINYBLOB or TINYTEXT − A BLOB or TEXT column with a maximum length of 255 characters. You do not specify a length with TINYBLOB or TINYTEXT.
MEDIUMBLOB or MEDIUMTEXT − A BLOB or TEXT column with a maximum length of 16777215 characters. You do not specify a length with MEDIUMBLOB or MEDIUMTEXT.
LONGBLOB or LONGTEXT − A BLOB or TEXT column with a maximum length of 4294967295 characters. You do not specify a length with LONGBLOB or LONGTEXT.
ENUM − An enumeration, which is a fancy term for list. When defining an ENUM, you are creating a list of items from which the value must be selected (or it can be NULL). For example, if you wanted your field to contain "A" or "B" or "C", you would define your ENUM as ENUM ('A', 'B', 'C') and only those values (or NULL) could ever populate that field.
In the next chapter, we will discuss how to create tables in MySQL.
To begin with, the table creation command requires the following details −
- Name of the table
- Name of the fields
- Definitions for each field
Syntax
Here is a generic SQL syntax to create a MySQL table −
CREATE TABLE table_name (column_name column_type);
Now, we will create the following table in the TUTORIALS database.
create table tutorials_tbl(
tutorial_id INT NOT NULL AUTO_INCREMENT,
tutorial_title VARCHAR(100) NOT NULL,
tutorial_author VARCHAR(40) NOT NULL,
submission_date DATE,
PRIMARY KEY ( tutorial_id )
);
Here, a few items need explanation −
Field Attribute NOT NULL is being used because we do not want this field to be NULL. So, if a user will try to create a record with a NULL value, then MySQL will raise an error.
Field Attribute AUTO_INCREMENT tells MySQL to go ahead and add the next available number to the id field.
Keyword PRIMARY KEY is used to define a column as a primary key. You can use multiple columns separated by a comma to define a primary key.
Creating Tables from Command Prompt
It is easy to create a MySQL table from the mysql> prompt. You will use the SQL command CREATE TABLE to create a table.
Example
Here is an example, which will create tutorials_tbl −
root@host# mysql -u root -p
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> CREATE TABLE tutorials_tbl(
-> tutorial_id INT NOT NULL AUTO_INCREMENT,
-> tutorial_title VARCHAR(100) NOT NULL,
-> tutorial_author VARCHAR(40) NOT NULL,
-> submission_date DATE,
-> PRIMARY KEY ( tutorial_id )
-> );
Query OK, 0 rows affected (0.16 sec)
mysql>
NOTE − MySQL does not terminate a command until you give a semicolon (;) at the end of SQL command.
Creating Tables Using PHP Script
To create new table in any existing database you would need to use PHP function mysql_query(). You will pass its second argument with a proper SQL command to create a table.
Example
The following program is an example to create a table using PHP script −
<html>
<head>
<title>Creating MySQL Tables</title>
</head>
<body>
<?php
$dbhost = 'localhost:3036'; $dbuser = 'root';
$dbpass = 'rootpassword'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) {
die('Could not connect: ' . mysql_error());
}
echo 'Connected successfully<br />';
$sql = "CREATE TABLE tutorials_tbl( ". "tutorial_id INT NOT NULL AUTO_INCREMENT, ". "tutorial_title VARCHAR(100) NOT NULL, ". "tutorial_author VARCHAR(40) NOT NULL, ". "submission_date DATE, ". "PRIMARY KEY ( tutorial_id )); "; mysql_select_db( 'TUTORIALS' ); $retval = mysql_query( $sql, $conn );
if(! $retval ) { die('Could not create table: ' . mysql_error()); } echo "Table created successfully\n"; mysql_close($conn);
?>
</body>
</html>
It is very easy to drop an existing MySQL table, but you need to be very careful while deleting any existing table because the data lost will not be recovered after deleting a table.
Syntax
Here is a generic SQL syntax to drop a MySQL table −
DROP TABLE table_name ;
Dropping Tables from the Command Prompt
To drop tables from the command prompt, we need to execute the DROP TABLE SQL command at the mysql> prompt.
Example
The following program is an example which deletes the tutorials_tbl −
root@host# mysql -u root -p
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> DROP TABLE tutorials_tbl
Query OK, 0 rows affected (0.8 sec)
mysql>
Dropping Tables Using PHP Script
To drop an existing table in any database, you would need to use the PHP function mysql_query(). You will pass its second argument with a proper SQL command to drop a table.
Example
<html>
<head>
<title>Creating MySQL Tables</title>
</head>
<body>
<?php
$dbhost = 'localhost:3036'; $dbuser = 'root';
$dbpass = 'rootpassword'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) {
die('Could not connect: ' . mysql_error());
}
echo 'Connected successfully<br />';
$sql = "DROP TABLE tutorials_tbl"; mysql_select_db( 'TUTORIALS' ); $retval = mysql_query( $sql, $conn );
if(! $retval ) { die('Could not delete table: ' . mysql_error()); } echo "Table deleted successfully\n"; mysql_close($conn);
?>
</body>
</html>
To insert data into a MySQL table, you would need to use the SQL INSERT INTO command. You can insert data into the MySQL table by using the mysql> prompt or by using any script like PHP.
Syntax
Here is a generic SQL syntax of INSERT INTO command to insert data into the MySQL table −
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
To insert string data types, it is required to keep all the values into double or single quotes. For example "value".
Inserting Data from the Command Prompt
To insert data from the command prompt, we will use SQL INSERT INTO command to insert data into MySQL table tutorials_tbl.
Example
The following example will create 3 records into tutorials_tbl table −
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> INSERT INTO tutorials_tbl
->(tutorial_title, tutorial_author, submission_date)
->VALUES
->("Learn PHP", "John Poul", NOW());
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO tutorials_tbl
->(tutorial_title, tutorial_author, submission_date)
->VALUES
->("Learn MySQL", "Abdul S", NOW());
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO tutorials_tbl
->(tutorial_title, tutorial_author, submission_date)
->VALUES
->("JAVA Tutorial", "Sanjay", '2007-05-06');
Query OK, 1 row affected (0.01 sec)
mysql>
NOTE − Please note that all the arrow signs (->) are not a part of the SQL command. They are indicating a new line and they are created automatically by the MySQL prompt while pressing the enter key without giving a semicolon at the end of each line of the command.
In the above example, we have not provided a tutorial_id because at the time of table creation, we had given AUTO_INCREMENT option for this field. So MySQL takes care of inserting these IDs automatically. Here, NOW() is a MySQL function, which returns the current date and time.
Inserting Data Using a PHP Script
You can use the same SQL INSERT INTO command into the PHP function mysql_query() to insert data into a MySQL table.
Example
This example will take three parameters from the user and will insert them into the MySQL table −
<html>
<head>
<title>Add New Record in MySQL Database</title>
</head>
<body>
<?php
if(isset($_POST['add'])) { $dbhost = 'localhost:3036';
$dbuser = 'root'; $dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) { die('Could not connect: ' . mysql_error()); } if(! get_magic_quotes_gpc() ) { $tutorial_title = addslashes ($_POST['tutorial_title']); $tutorial_author = addslashes ($_POST['tutorial_author']); } else { $tutorial_title = $_POST['tutorial_title']; $tutorial_author = $_POST['tutorial_author']; } $submission_date = $_POST['submission_date']; $sql = "INSERT INTO tutorials_tbl ".
"(tutorial_title,tutorial_author, submission_date) "."VALUES ".
"('$tutorial_title','$tutorial_author','$submission_date')"; mysql_select_db('TUTORIALS'); $retval = mysql_query( $sql, $conn );
if(! $retval ) { die('Could not enter data: ' . mysql_error()); } echo "Entered data successfully\n"; mysql_close($conn);
} else {
?>
<form method = "post" action = "<?php $_PHP_SELF ?>">
<table width = "600" border = "0" cellspacing = "1" cellpadding = "2">
<tr>
<td width = "250">Tutorial Title</td>
<td>
<input name = "tutorial_title" type = "text" id = "tutorial_title">
</td>
</tr>
<tr>
<td width = "250">Tutorial Author</td>
<td>
<input name = "tutorial_author" type = "text" id = "tutorial_author">
</td>
</tr>
<tr>
<td width = "250">Submission Date [ yyyy-mm-dd ]</td>
<td>
<input name = "submission_date" type = "text" id = "submission_date">
</td>
</tr>
<tr>
<td width = "250"> </td>
<td> </td>
</tr>
<tr>
<td width = "250"> </td>
<td>
<input name = "add" type = "submit" id = "add" value = "Add Tutorial">
</td>
</tr>
</table>
</form>
<?php
}
?>
</body>
</html>
While doing a data insert, it is best to use the function get_magic_quotes_gpc() to check if the current configuration for magic quote is set or not. If this function returns false, then use the function addslashes() to add slashes before the quotes.
入力されたデータが正しいかどうかを確認するために多くの検証を行うことができ、適切なアクションを実行できます。
SQL SELECTコマンドは、MySQLデータベースからデータをフェッチするために使用されます。このコマンドは、mysql>プロンプト、およびPHPなどの任意のスクリプトで使用できます。
構文
これは、MySQLテーブルからデータをフェッチするためのSELECTコマンドの一般的なSQL構文です。
SELECT field1, field2,...fieldN
FROM table_name1, table_name2...
[WHERE Clause]
[OFFSET M ][LIMIT N]
カンマで区切られた1つ以上のテーブルを使用して、WHERE句を使用してさまざまな条件を含めることができますが、WHERE句はSELECTコマンドのオプション部分です。
1つのSELECTコマンドで1つ以上のフィールドをフェッチできます。
フィールドの代わりにスター(*)を指定できます。この場合、SELECTはすべてのフィールドを返します。
WHERE句を使用して任意の条件を指定できます。
を使用してオフセットを指定できます OFFSETSELECTがレコードの返送を開始する場所から。デフォルトでは、オフセットはゼロから始まります。
を使用して返品の数を制限できます LIMIT 属性。
コマンドプロンプトからのデータのフェッチ
これは、SQLSELECTコマンドを使用してMySQLテーブルからデータをフェッチします tutorials_tbl。
例
次の例では、からすべてのレコードを返します。 tutorials_tbl テーブル-
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * from tutorials_tbl
+-------------+----------------+-----------------+-----------------+
| tutorial_id | tutorial_title | tutorial_author | submission_date |
+-------------+----------------+-----------------+-----------------+
| 1 | Learn PHP | John Poul | 2007-05-21 |
| 2 | Learn MySQL | Abdul S | 2007-05-21 |
| 3 | JAVA Tutorial | Sanjay | 2007-05-21 |
+-------------+----------------+-----------------+-----------------+
3 rows in set (0.01 sec)
mysql>
PHPスクリプトを使用したデータの取得
同じSQLSELECTコマンドをPHP関数に使用できます mysql_query()。この関数は、SQLコマンドを実行し、後で別のPHP関数を実行するために使用されます。mysql_fetch_array()選択したすべてのデータをフェッチするために使用できます。この関数は、行を連想配列、数値配列、またはその両方として返します。行がなくなると、この関数はFALSEを返します。
次のプログラムは、からレコードをフェッチ/表示する方法を示す簡単な例です。 tutorials_tbl テーブル。
例
次のコードブロックは、tutorials_tblテーブルのすべてのレコードを表示します。
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root'; $dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) { die('Could not connect: ' . mysql_error()); } $sql = 'SELECT tutorial_id, tutorial_title, tutorial_author, submission_date FROM tutorials_tbl';
mysql_select_db('TUTORIALS');
$retval = mysql_query( $sql, $conn ); if(! $retval ) {
die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
echo "Tutorial ID :{$row['tutorial_id']} <br> ". "Title: {$row['tutorial_title']} <br> ".
"Author: {$row['tutorial_author']} <br> ". "Submission Date : {$row['submission_date']} <br> ".
"--------------------------------<br>";
}
echo "Fetched data successfully\n";
mysql_close($conn);
?>
行の内容が変数$ rowに割り当てられ、その行の値が出力されます。
NOTE −配列値を文字列に直接挿入する場合は、必ず中括弧を付けるようにしてください。
上記の例では、定数 MYSQL_ASSOC PHP関数の2番目の引数として使用されます mysql_fetch_array()、行を連想配列として返すようにします。連想配列を使用すると、インデックスを使用する代わりに名前を使用してフィールドにアクセスできます。
PHPはと呼ばれる別の関数を提供します mysql_fetch_assoc()、これも行を連想配列として返します。
例
次の例では、mysql_fetch_assoc()関数を使用してtutorial_tblテーブルのすべてのレコードを表示します。
<?php
$dbhost = 'localhost:3036'; $dbuser = 'root';
$dbpass = 'rootpassword'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) {
die('Could not connect: ' . mysql_error());
}
$sql = 'SELECT tutorial_id, tutorial_title, tutorial_author, submission_date FROM tutorials_tbl'; mysql_select_db('TUTORIALS'); $retval = mysql_query( $sql, $conn );
if(! $retval ) { die('Could not get data: ' . mysql_error()); } while($row = mysql_fetch_assoc($retval)) { echo "Tutorial ID :{$row['tutorial_id']} <br> ".
"Title: {$row['tutorial_title']} <br> ". "Author: {$row['tutorial_author']} <br> ".
"Submission Date : {$row['submission_date']} <br> ". "--------------------------------<br>"; } echo "Fetched data successfully\n"; mysql_close($conn);
?>
定数を使用することもできます MYSQL_NUMPHP関数mysql_fetch_array()の2番目の引数として。これにより、関数は数値インデックスを持つ配列を返します。
例
次の例を試して、MYSQL_NUM引数を使用してtutorials_tblテーブルのすべてのレコードを表示します。
<?php
$dbhost = 'localhost:3036'; $dbuser = 'root';
$dbpass = 'rootpassword'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) {
die('Could not connect: ' . mysql_error());
}
$sql = 'SELECT tutorial_id, tutorial_title, tutorial_author, submission_date FROM tutorials_tbl'; mysql_select_db('TUTORIALS'); $retval = mysql_query( $sql, $conn );
if(! $retval ) { die('Could not get data: ' . mysql_error()); } while($row = mysql_fetch_array($retval, MYSQL_NUM)) { echo "Tutorial ID :{$row[0]} <br> ".
"Title: {$row[1]} <br> ". "Author: {$row[2]} <br> ".
"Submission Date : {$row[3]} <br> ". "--------------------------------<br>"; } echo "Fetched data successfully\n"; mysql_close($conn);
?>
上記の3つの例はすべて、同じ結果を生成します。
メモリの解放
各SELECTステートメントの最後でカーソルメモリを解放することをお勧めします。これは、PHP関数を使用して実行できますmysql_free_result()。次のプログラムは、その使用方法を示す例です。
例
次の例を試してください-
<?php
$dbhost = 'localhost:3036'; $dbuser = 'root';
$dbpass = 'rootpassword'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) {
die('Could not connect: ' . mysql_error());
}
$sql = 'SELECT tutorial_id, tutorial_title, tutorial_author, submission_date FROM tutorials_tbl'; mysql_select_db('TUTORIALS'); $retval = mysql_query( $sql, $conn );
if(! $retval ) { die('Could not get data: ' . mysql_error()); } while($row = mysql_fetch_array($retval, MYSQL_NUM)) { echo "Tutorial ID :{$row[0]} <br> ".
"Title: {$row[1]} <br> ". "Author: {$row[2]} <br> ".
"Submission Date : {$row[3]} <br> ". "--------------------------------<br>"; } mysql_free_result($retval);
echo "Fetched data successfully\n";
mysql_close($conn);
?>
データをフェッチしている間、好きなだけ複雑なコードを書くことができますが、手順は上記と同じままです。
SQLを見てきました SELECTMySQLテーブルからデータをフェッチするコマンド。と呼ばれる条件節を使用できますWHERE Clause結果を除外します。このWHERE句を使用して、テーブルから必要なレコードを選択するための選択基準を指定できます。
構文
次のコードブロックには、MySQLテーブルからデータをフェッチするためのWHERE句を含むSELECTコマンドの汎用SQL構文があります。
SELECT field1, field2,...fieldN table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....
カンマで区切られた1つ以上のテーブルを使用して、WHERE句を使用してさまざまな条件を含めることができますが、WHERE句はSELECTコマンドのオプション部分です。
WHERE句を使用して任意の条件を指定できます。
を使用して複数の条件を指定できます AND または OR 演算子。
WHERE句をDELETEまたはUPDATESQLコマンドと一緒に使用して、条件を指定することもできます。
ザ・ WHERE 句は次のように機能します if condition任意のプログラミング言語で。この句は、指定された値をMySQLテーブルで使用可能なフィールド値と比較するために使用されます。外部からの指定された値がMySQLテーブルで使用可能なフィールド値と等しい場合、その行を返します。
これは、で使用できる演算子のリストです。 WHERE 句。
フィールドAが10を保持し、フィールドBが20を保持すると仮定すると、-
オペレーター | 説明 | 例 |
---|---|---|
= | 2つのオペランドの値が等しいかどうかをチェックし、等しい場合は条件が真になります。 | (A = B)は真ではありません。 |
!= | 2つのオペランドの値が等しいかどうかをチェックし、値が等しくない場合は条件が真になります。 | (A!= B)は真です。 |
>> | 左側のオペランドの値が右側のオペランドの値より大きいかどうかを確認します。大きい場合は、条件が真になります。 | (A> B)は正しくありません。 |
< | 左側のオペランドの値が右側のオペランドの値よりも小さいかどうかを確認します。小さい場合は、条件が真になります。 | (A <B)は真です。 |
> = | 左のオペランドの値が右のオペランドの値以上であるかどうかをチェックし、そうである場合は、条件が真になります。 | (A> = B)は正しくありません。 |
<= | 左のオペランドの値が右のオペランドの値以下であるかどうかをチェックし、そうである場合は、条件が真になります。 | (A <= B)は真です。 |
WHERE句は、選択した行をテーブルからフェッチする場合、特にWHERE句を使用する場合に非常に便利です。 MySQL Join。結合については、別の章で説明します。
を使用してレコードを検索するのが一般的な方法です。 Primary Key 検索を高速化します。
指定された条件がテーブル内のどのレコードとも一致しない場合、クエリは行を返しません。
コマンドプロンプトからデータを取得する
これは、WHERE句を指定したSQL SELECTコマンドを使用して、選択したデータをMySQLテーブルからフェッチします– tutorials_tbl。
例
次の例では、からすべてのレコードを返します。 tutorials_tbl 著者名が Sanjay。
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * from tutorials_tbl WHERE tutorial_author = 'Sanjay';
+-------------+----------------+-----------------+-----------------+
| tutorial_id | tutorial_title | tutorial_author | submission_date |
+-------------+----------------+-----------------+-----------------+
| 3 | JAVA Tutorial | Sanjay | 2007-05-21 |
+-------------+----------------+-----------------+-----------------+
1 rows in set (0.01 sec)
mysql>
実行しない限り LIKE文字列での比較では、大文字と小文字は区別されません。を使用して、検索で大文字と小文字を区別することができますBINARY 次のようなキーワード-
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * from tutorials_tbl \
WHERE BINARY tutorial_author = 'sanjay';
Empty set (0.02 sec)
mysql>
PHPスクリプトを使用したデータの取得
同じSQLSELECTコマンドをWHERECLAUSEとともにPHP関数に使用できます。 mysql_query()。この関数は、SQLコマンドと後で別のPHP関数を実行するために使用されますmysql_fetch_array()選択したすべてのデータをフェッチするために使用できます。この関数は、行を連想配列、数値配列、またはその両方として返します。行がなくなると、この関数はFALSEを返します。
例
次の例では、からすべてのレコードを返します。 tutorials_tbl 著者名が Sanjay −
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root'; $dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) { die('Could not connect: ' . mysql_error()); } $sql = 'SELECT tutorial_id, tutorial_title,
tutorial_author, submission_date
FROM tutorials_tbl
WHERE tutorial_author = "Sanjay"';
mysql_select_db('TUTORIALS');
$retval = mysql_query( $sql, $conn ); if(! $retval ) {
die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
echo "Tutorial ID :{$row['tutorial_id']} <br> ". "Title: {$row['tutorial_title']} <br> ".
"Author: {$row['tutorial_author']} <br> ". "Submission Date : {$row['submission_date']} <br> ".
"--------------------------------<br>";
}
echo "Fetched data successfully\n";
mysql_close($conn);
?>
MySQLテーブルの既存のデータを変更する必要がある場合があります。SQLを使用してこれを行うことができますUPDATEコマンド。これにより、MySQLテーブルのフィールド値が変更されます。
構文
次のコードブロックには、MySQLテーブルのデータを変更するためのUPDATEコマンドの汎用SQL構文があります。
UPDATE table_name SET field1 = new-value1, field2 = new-value2
[WHERE Clause]
- 1つ以上のフィールドを完全に更新できます。
- WHERE句を使用して任意の条件を指定できます。
- 一度に1つのテーブルの値を更新できます。
WHERE句は、テーブル内の選択した行を更新する場合に非常に役立ちます。
コマンドプロンプトからのデータの更新
これは、WHERE句を指定したSQL UPDATEコマンドを使用して、MySQLテーブルで選択されたデータを更新します。 tutorials_tbl。
例
次の例では、 tutorial_title tutorial_idが3であるレコードのフィールド。
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> UPDATE tutorials_tbl
-> SET tutorial_title = 'Learning JAVA'
-> WHERE tutorial_id = 3;
Query OK, 1 row affected (0.04 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql>
PHPスクリプトを使用したデータの更新
PHP関数へのWHERECLAUSEの有無にかかわらずSQLUPDATEコマンドを使用できます– mysql_query()。この関数は、mysql>プロンプトで実行されるのと同様の方法でSQLコマンドを実行します。
例
を更新する次の例 tutorial_title tutorial_idが3であるレコードのフィールド。
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root'; $dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) { die('Could not connect: ' . mysql_error()); } $sql = 'UPDATE tutorials_tbl
SET tutorial_title="Learning JAVA"
WHERE tutorial_id=3';
mysql_select_db('TUTORIALS');
$retval = mysql_query( $sql, $conn ); if(! $retval ) {
die('Could not update data: ' . mysql_error());
}
echo "Updated data successfully\n";
mysql_close($conn);
?>
MySQLテーブルからレコードを削除する場合は、SQLコマンドを使用できます。 DELETE FROM。このコマンドは、mysql>プロンプトおよびPHPなどの任意のスクリプトで使用できます。
構文
次のコードブロックには、MySQLテーブルからデータを削除するためのDELETEコマンドの汎用SQL構文があります。
DELETE FROM table_name [WHERE Clause]
WHERE句が指定されていない場合、すべてのレコードが指定されたMySQLテーブルから削除されます。
WHERE句を使用して任意の条件を指定できます。
一度に1つのテーブルのレコードを削除できます。
WHERE句は、テーブル内の選択した行を削除する場合に非常に便利です。
コマンドプロンプトからのデータの削除
これは、WHERE句を指定したSQL DELETEコマンドを使用して、選択したデータをMySQLテーブルに削除します– tutorials_tbl。
例
次の例では、tutorial_idが3のtutorial_tblからレコードを削除します。
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> DELETE FROM tutorials_tbl WHERE tutorial_id=3;
Query OK, 1 row affected (0.23 sec)
mysql>
PHPスクリプトを使用したデータの削除
PHP関数へのWHERECLAUSEの有無にかかわらずSQLDELETEコマンドを使用できます– mysql_query()。この関数は、mysql>プロンプトで実行されるのと同じ方法でSQLコマンドを実行します。
例
次の例を試して、tutorial_idが3のtutorial_tblからレコードを削除してください。
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root'; $dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) { die('Could not connect: ' . mysql_error()); } $sql = 'DELETE FROM tutorials_tbl WHERE tutorial_id = 3';
mysql_select_db('TUTORIALS');
$retval = mysql_query( $sql, $conn ); if(! $retval ) {
die('Could not delete data: ' . mysql_error());
}
echo "Deleted data successfully\n";
mysql_close($conn);
?>
SQLを見てきました SELECTMySQLテーブルからデータをフェッチするコマンド。と呼ばれる条件節を使用することもできますWHERE 必要なレコードを選択する句。
'equal to'記号(=)を含むWHERE句は、完全一致を実行する場合に正常に機能します。「tutorial_author = 'Sanjay'」のように。ただし、tutorial_author名に「jay」を含める必要があるすべての結果を除外する必要がある場合があります。これは、を使用して処理できますSQL LIKE Clause WHERE句とともに。
SQL LIKE句を%文字と一緒に使用すると、UNIXの場合と同様にメタ文字(*)のように機能し、コマンドプロンプトですべてのファイルまたはディレクトリを一覧表示します。%文字がない場合、LIKE句はequal to WHERE句とともに署名します。
構文
次のコードブロックには、MySQLテーブルからデータをフェッチするためのLIKE句とともにSELECTコマンドの汎用SQL構文があります。
SELECT field1, field2,...fieldN table_name1, table_name2...
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
WHERE句を使用して任意の条件を指定できます。
LIKE句をWHERE句と一緒に使用できます。
の代わりにLIKE句を使用できます equals to 符号。
LIKEを%記号と一緒に使用すると、メタ文字検索のように機能します。
を使用して複数の条件を指定できます AND または OR 演算子。
WHERE ... LIKE句をDELETEまたはUPDATESQLコマンドと一緒に使用して、条件を指定することもできます。
コマンドプロンプトでLIKE句を使用する
これは、WHERE ... LIKE句を指定したSQLSELECTコマンドを使用して、選択したデータをMySQLテーブルからフェッチします– tutorials_tbl。
例
次の例では、からすべてのレコードを返します。 tutorials_tbl 著者名がで終わるテーブル jay −
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * from tutorials_tbl
-> WHERE tutorial_author LIKE '%jay';
+-------------+----------------+-----------------+-----------------+
| tutorial_id | tutorial_title | tutorial_author | submission_date |
+-------------+----------------+-----------------+-----------------+
| 3 | JAVA Tutorial | Sanjay | 2007-05-21 |
+-------------+----------------+-----------------+-----------------+
1 rows in set (0.01 sec)
mysql>
PHPスクリプト内でのLIKE句の使用
WHERE ... LIKE句と同様の構文をPHP関数に使用できます– mysql_query()。この関数は、SQLコマンドと後で別のPHP関数を実行するために使用されます–mysql_fetch_array() SELECTコマンドとともにWHERE ... LIKE句を使用すると、選択したすべてのデータをフェッチするために使用できます。
ただし、WHERE ... LIKE句がDELETEまたはUPDATEコマンドで使用されている場合は、それ以上のPHP関数呼び出しは必要ありません。
例
次の例を試して、からすべてのレコードを返します。 tutorials_tbl 著者名が含まれているテーブル jay −
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root'; $dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) { die('Could not connect: ' . mysql_error()); } $sql = 'SELECT tutorial_id, tutorial_title,
tutorial_author, submission_date
FROM tutorials_tbl
WHERE tutorial_author LIKE "%jay%"';
mysql_select_db('TUTORIALS');
$retval = mysql_query( $sql, $conn ); if(! $retval ) {
die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
echo "Tutorial ID :{$row['tutorial_id']} <br> ". "Title: {$row['tutorial_title']} <br> ".
"Author: {$row['tutorial_author']} <br> ". "Submission Date : {$row['submission_date']} <br> ".
"--------------------------------<br>";
}
echo "Fetched data successfully\n";
mysql_close($conn);
?>
SQLを見てきました SELECTMySQLテーブルからデータをフェッチするコマンド。行を選択すると、MySQLサーバーは、結果の並べ替え方法を指示しない限り、任意の順序で行を自由に返すことができます。ただし、結果セットを並べ替えるには、ORDER BY ソートする1つまたは複数の列に名前を付ける句。
構文
次のコードブロックは、MySQLテーブルからデータを並べ替えるためのORDERBY句を含むSELECTコマンドの汎用SQL構文です。
SELECT field1, field2,...fieldN table_name1, table_name2...
ORDER BY field1, [field2...] [ASC [DESC]]
そのフィールドがリストされている場合は、返された結果を任意のフィールドで並べ替えることができます。
結果は複数のフィールドで並べ替えることができます。
キーワードASCまたはDESCを使用して、結果を昇順または降順で取得できます。デフォルトでは、昇順です。
通常の方法でWHERE ... LIKE句を使用して、条件を設定できます。
コマンドプロンプトでのORDERBY句の使用
これは、SQLSELECTコマンドを ORDER BY MySQLテーブルからデータをフェッチする句– tutorials_tbl。
例
次の例を試してください。この例では、結果が昇順で返されます。
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * from tutorials_tbl ORDER BY tutorial_author ASC
+-------------+----------------+-----------------+-----------------+
| tutorial_id | tutorial_title | tutorial_author | submission_date |
+-------------+----------------+-----------------+-----------------+
| 2 | Learn MySQL | Abdul S | 2007-05-24 |
| 1 | Learn PHP | John Poul | 2007-05-24 |
| 3 | JAVA Tutorial | Sanjay | 2007-05-06 |
+-------------+----------------+-----------------+-----------------+
3 rows in set (0.42 sec)
mysql>
昇順でリストされているすべての作成者名を確認します。
PHPスクリプト内でのORDERBY句の使用
ORDER BY句と同様の構文をPHP関数に使用できます– mysql_query()。この関数は、SQLコマンドと後で別のPHP関数を実行するために使用されますmysql_fetch_array() 選択したすべてのデータをフェッチするために使用できます。
例
次の例を試してください。この例では、チュートリアルの作成者の降順で結果が返されます。
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root'; $dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) { die('Could not connect: ' . mysql_error()); } $sql = 'SELECT tutorial_id, tutorial_title,
tutorial_author, submission_date
FROM tutorials_tbl
ORDER BY tutorial_author DESC';
mysql_select_db('TUTORIALS');
$retval = mysql_query( $sql, $conn ); if(! $retval ) {
die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
echo "Tutorial ID :{$row['tutorial_id']} <br> ". "Title: {$row['tutorial_title']} <br> ".
"Author: {$row['tutorial_author']} <br> ". "Submission Date : {$row['submission_date']} <br> ".
"--------------------------------<br>";
}
echo "Fetched data successfully\n";
mysql_close($conn);
?>
前の章では、一度に1つのテーブルからデータを取得していました。これは単純なテイクには十分ですが、実際のMySQLの使用法のほとんどでは、1つのクエリで複数のテーブルからデータを取得する必要があることがよくあります。
1つのSQLクエリで複数のテーブルを使用できます。MySQLに参加するという行為は、2つ以上のテーブルを1つのテーブルに粉砕することを指します。
SELECT、UPDATE、およびDELETEステートメントでJOINSを使用して、MySQLテーブルを結合できます。単純なMySQLJOINとは異なるLEFTJOINの例も示します。
コマンドプロンプトでの結合の使用
2つのテーブルがあると仮定します tcount_tbl そして tutorials_tbl、チュートリアルで。次に、以下の例を見てください。
例
次の例-
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * FROM tcount_tbl;
+-----------------+----------------+
| tutorial_author | tutorial_count |
+-----------------+----------------+
| mahran | 20 |
| mahnaz | NULL |
| Jen | NULL |
| Gill | 20 |
| John Poul | 1 |
| Sanjay | 1 |
+-----------------+----------------+
6 rows in set (0.01 sec)
mysql> SELECT * from tutorials_tbl;
+-------------+----------------+-----------------+-----------------+
| tutorial_id | tutorial_title | tutorial_author | submission_date |
+-------------+----------------+-----------------+-----------------+
| 1 | Learn PHP | John Poul | 2007-05-24 |
| 2 | Learn MySQL | Abdul S | 2007-05-24 |
| 3 | JAVA Tutorial | Sanjay | 2007-05-06 |
+-------------+----------------+-----------------+-----------------+
3 rows in set (0.00 sec)
mysql>
これで、これら2つのテーブルを結合するSQLクエリを作成できます。このクエリは、テーブルからすべての作成者を選択しますtutorials_tbl から対応する数のチュートリアルをピックアップします tcount_tbl。
mysql> SELECT a.tutorial_id, a.tutorial_author, b.tutorial_count
-> FROM tutorials_tbl a, tcount_tbl b
-> WHERE a.tutorial_author = b.tutorial_author;
+-------------+-----------------+----------------+
| tutorial_id | tutorial_author | tutorial_count |
+-------------+-----------------+----------------+
| 1 | John Poul | 1 |
| 3 | Sanjay | 1 |
+-------------+-----------------+----------------+
2 rows in set (0.01 sec)
mysql>
PHPスクリプトでの結合の使用
PHPスクリプトでは、上記のSQLクエリのいずれかを使用できます。SQLクエリをPHP関数に渡すだけです。mysql_query() 次に、通常の方法で結果をフェッチします。
例
次の例-
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root'; $dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) { die('Could not connect: ' . mysql_error()); } $sql = 'SELECT a.tutorial_id, a.tutorial_author, b.tutorial_count
FROM tutorials_tbl a, tcount_tbl b
WHERE a.tutorial_author = b.tutorial_author';
mysql_select_db('TUTORIALS');
$retval = mysql_query( $sql, $conn ); if(! $retval ) {
die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
echo "Author:{$row['tutorial_author']} <br> ". "Count: {$row['tutorial_count']} <br> ".
"Tutorial ID: {$row['tutorial_id']} <br> ". "--------------------------------<br>"; } echo "Fetched data successfully\n"; mysql_close($conn);
?>
MySQL LEFT JOIN
MySQLの左結合は、単純結合とは異なります。MySQL LEFT JOINは、左側のテーブルにいくつかの追加の考慮事項を与えます。
私がするなら LEFT JOIN、同じ方法で一致するすべてのレコードを取得し、さらに、結合の左側のテーブルで一致しないレコードごとに追加のレコードを取得します。したがって、(私の例では)すべての著者が言及されるようにします。
例
次の例を試して、LEFTJOINを理解してください。
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT a.tutorial_id, a.tutorial_author, b.tutorial_count
-> FROM tutorials_tbl a LEFT JOIN tcount_tbl b
-> ON a.tutorial_author = b.tutorial_author;
+-------------+-----------------+----------------+
| tutorial_id | tutorial_author | tutorial_count |
+-------------+-----------------+----------------+
| 1 | John Poul | 1 |
| 2 | Abdul S | NULL |
| 3 | Sanjay | 1 |
+-------------+-----------------+----------------+
3 rows in set (0.02 sec)
JOINSに慣れるには、さらに練習する必要があります。これはMySQL / SQLの少し複雑な概念であり、実際の例を実行することでより明確になります。
SQLを見てきました SELECT と一緒にコマンド WHERE MySQLテーブルからデータをフェッチする句ですが、フィールドまたは列の値を比較する条件を指定しようとすると、 NULL、正しく動作しません。
このような状況を処理するために、MySQLは3つの演算子を提供します-
IS NULL −列の値がNULLの場合、この演算子はtrueを返します。
IS NOT NULL −列の値がNULLでない場合、この演算子はtrueを返します。
<=> −この演算子は値を比較します。これは(=演算子とは異なり)2つのNULL値に対しても当てはまります。
NULLを含む条件は特別です。=は使用できませんNULL または!= NULL列でNULL値を検索します。そのような比較は、それらが真であるかどうかを判断することが不可能であるため、常に失敗します。NULL = NULLでも失敗することがあります。
NULLである、またはNULLでない列を検索するには、次を使用します。 IS NULL または IS NOT NULL。
コマンドプロンプトでNULL値を使用する
と呼ばれるテーブルがあると仮定します tcount_tbl チュートリアルデータベースにあり、2つの列が含まれています。 tutorial_author そして tutorial_count、ここでNULLのtutorial_countは、値が不明であることを示します。
例
次の例を試してください-
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> create table tcount_tbl
-> (
-> tutorial_author varchar(40) NOT NULL,
-> tutorial_count INT
-> );
Query OK, 0 rows affected (0.05 sec)
mysql> INSERT INTO tcount_tbl
-> (tutorial_author, tutorial_count) values ('mahran', 20);
mysql> INSERT INTO tcount_tbl
-> (tutorial_author, tutorial_count) values ('mahnaz', NULL);
mysql> INSERT INTO tcount_tbl
-> (tutorial_author, tutorial_count) values ('Jen', NULL);
mysql> INSERT INTO tcount_tbl
-> (tutorial_author, tutorial_count) values ('Gill', 20);
mysql> SELECT * from tcount_tbl;
+-----------------+----------------+
| tutorial_author | tutorial_count |
+-----------------+----------------+
| mahran | 20 |
| mahnaz | NULL |
| Jen | NULL |
| Gill | 20 |
+-----------------+----------------+
4 rows in set (0.00 sec)
mysql>
あなたはそれを見ることができます=と != 次のようにNULL値を処理しないでください-
mysql> SELECT * FROM tcount_tbl WHERE tutorial_count = NULL;
Empty set (0.00 sec)
mysql> SELECT * FROM tcount_tbl WHERE tutorial_count != NULL;
Empty set (0.01 sec)
tutorial_count列がNULLであるかどうかに関係なく、レコードを見つけるには、次のプログラムに示すようにクエリを作成する必要があります。
mysql> SELECT * FROM tcount_tbl
-> WHERE tutorial_count IS NULL;
+-----------------+----------------+
| tutorial_author | tutorial_count |
+-----------------+----------------+
| mahnaz | NULL |
| Jen | NULL |
+-----------------+----------------+
2 rows in set (0.00 sec)
mysql> SELECT * from tcount_tbl
-> WHERE tutorial_count IS NOT NULL;
+-----------------+----------------+
| tutorial_author | tutorial_count |
+-----------------+----------------+
| mahran | 20 |
| Gill | 20 |
+-----------------+----------------+
2 rows in set (0.00 sec)
PHPスクリプトでのNULL値の処理
あなたは使用することができます if...else NULL値に基づいてクエリを準備するための条件。
例
次の例では、 tutorial_count 外部から取得し、テーブルで使用可能な値と比較します。
<?php
$dbhost = 'localhost:3036'; $dbuser = 'root';
$dbpass = 'rootpassword'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) {
die('Could not connect: ' . mysql_error());
}
if( isset($tutorial_count )) { $sql = 'SELECT tutorial_author, tutorial_count
FROM tcount_tbl
WHERE tutorial_count = $tutorial_count'; } else { $sql = 'SELECT tutorial_author, tutorial_count
FROM tcount_tbl
WHERE tutorial_count IS $tutorial_count'; } mysql_select_db('TUTORIALS'); $retval = mysql_query( $sql, $conn );
if(! $retval ) { die('Could not get data: ' . mysql_error()); } while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) { echo "Author:{$row['tutorial_author']} <br> ".
"Count: {$row['tutorial_count']} <br> ". "--------------------------------<br>"; } echo "Fetched data successfully\n"; mysql_close($conn);
?>
MySQLのパターンマッチングを見てきました LIKE ...%。MySQLは、正規表現に基づく別のタイプのパターンマッチング操作をサポートしています。REGEXPオペレーター。PHPまたはPERLを知っている場合、このマッチングは正規表現のスクリプトと同じであるため、理解するのは非常に簡単です。
以下は、と一緒に使用できるパターンの表です。 REGEXP オペレーター。
パターン | パターンが一致するもの |
---|---|
^ | 文字列の始まり |
$ | 文字列の終わり |
。 | 任意の1文字 |
[...] | 角括弧の間にリストされている文字 |
[^ ...] | 角括弧の間にリストされていない文字 |
p1 | p2 | p3 | 交替; パターンp1、p2、またはp3のいずれかに一致します |
* | 先行する要素の0個以上のインスタンス |
+ | 前の要素の1つ以上のインスタンス |
{n} | 前の要素のn個のインスタンス |
{m、n} | 前の要素のmからn個のインスタンス |
例
上記の表に基づいて、要件を満たすためにさまざまなタイプのSQLクエリをデバイス化できます。ここでは、理解のためにいくつかリストします。
と呼ばれるテーブルがあると考えてください person_tbl そしてそれは呼ばれるフィールドを持っています name −
で始まるすべての名前を検索するためのクエリ 'st' −
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';
で終わるすべての名前を見つけるためにクエリを実行します 'ok' −
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';
を含むすべての名前を見つけるためにクエリを実行します 'mar' −
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';
母音で始まり、で終わるすべての名前を見つけるためにクエリを実行します 'ok' −
mysql> SELECT FirstName FROM intque.person_tbl WHERE FirstName REGEXP '^[aeiou].*ok$';
トランザクションは、データベース操作操作の順次グループであり、単一の作業単位であるかのように実行されます。つまり、グループ内の個々の操作が成功しない限り、トランザクションは完了しません。トランザクション内のいずれかの操作が失敗すると、トランザクション全体が失敗します。
実際には、多くのSQLクエリをグループにまとめ、トランザクションの一部としてそれらすべてを一緒に実行します。
トランザクションのプロパティ
トランザクションには次の4つの標準プロパティがあり、通常は頭字語で呼ばれます。 ACID −
Atomicity−これにより、ワークユニット内のすべての操作が正常に完了します。それ以外の場合、トランザクションは失敗した時点で中止され、以前の操作は以前の状態にロールバックされます。
Consistency −これにより、トランザクションが正常にコミットされたときにデータベースの状態が適切に変更されます。
Isolation −これにより、トランザクションは相互に独立して透過的に動作できます。
Durability −これにより、システム障害が発生した場合でも、コミットされたトランザクションの結果または効果が持続します。
MySQLでは、トランザクションはステートメントで始まります BEGIN WORK そして、いずれかで終わります COMMIT または ROLLBACKステートメント。開始ステートメントと終了ステートメントの間のSQLコマンドは、トランザクションの大部分を形成します。
コミットとロールバック
これらの2つのキーワード Commit そして Rollback 主にMySQLトランザクションに使用されます。
トランザクションが正常に完了したら、COMMITコマンドを発行して、関連するすべてのテーブルへの変更を有効にする必要があります。
障害が発生した場合は、ROLLBACKコマンドを発行して、トランザクションで参照されているすべてのテーブルを以前の状態に戻す必要があります。
と呼ばれるセッション変数を設定することにより、トランザクションの動作を制御できます。 AUTOCOMMIT。AUTOCOMMITが1(デフォルト)に設定されている場合、各SQLステートメント(トランザクション内かどうかに関係なく)は完全なトランザクションと見なされ、終了時にデフォルトでコミットされます。
AUTOCOMMITが0に設定されている場合、 SET AUTOCOMMIT = 0 コマンドを実行すると、後続の一連のステートメントはトランザクションのように機能し、明示的なCOMMITステートメントが発行されるまでアクティビティはコミットされません。
これらのSQLコマンドは、PHPで次のコマンドを使用して実行できます。 mysql_query() 関数。
トランザクションの一般的な例
この一連のイベントは、使用されるプログラミング言語とは無関係です。論理パスは、アプリケーションの作成に使用する言語で作成できます。
これらのSQLコマンドは、PHPで次のコマンドを使用して実行できます。 mysql_query() 関数。
SQLコマンドを発行してトランザクションを開始します BEGIN WORK。
SELECT、INSERT、UPDATE、DELETEなどの1つ以上のSQLコマンドを発行します。
エラーがなく、すべてが要件に従っているかどうかを確認します。
エラーがある場合は、ROLLBACKコマンドを発行します。それ以外の場合は、COMMITコマンドを発行します。
MySQLのトランザクションセーフなテーブルタイプ
トランザクションを直接使用することはできませんが、特定の例外については使用できます。ただし、それらは安全で保証されていません。MySQLプログラミングでトランザクションを使用する場合は、特別な方法でテーブルを作成する必要があります。トランザクションをサポートするテーブルには多くの種類がありますが、最も人気のあるものはInnoDB。
InnoDBテーブルのサポートには、ソースからMySQLをコンパイルするときに特定のコンパイルパラメーターが必要です。MySQLバージョンがInnoDBをサポートしていない場合は、インターネットサービスプロバイダーに、InnoDBテーブルタイプをサポートするMySQLのバージョンを構築するか、ダウンロードしてインストールするように依頼してください。MySQL-Max Binary Distribution WindowsまたはLinux / UNIXの場合、開発環境でテーブルタイプを操作します。
MySQLインストールがInnoDBテーブルをサポートしている場合は、 TYPE = InnoDB テーブル作成ステートメントの定義。
たとえば、次のコードは、というInnoDBテーブルを作成します。 tcount_tbl −
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> create table tcount_tbl
-> (
-> tutorial_author varchar(40) NOT NULL,
-> tutorial_count INT
-> ) TYPE = InnoDB;
Query OK, 0 rows affected (0.05 sec)
InnoDBの詳細については、次のリンクをクリックしてください-InnoDB
次のような他のテーブルタイプを使用できます GEMINI または BDB、ただし、これら2つのテーブルタイプをサポートするかどうかは、インストールによって異なります。
MySQL ALTER このコマンドは、テーブルの名前やテーブルフィールドを変更する場合、またはテーブルの既存の列を追加または削除する場合に非常に便利です。
と呼ばれるテーブルの作成から始めましょう testalter_tbl。
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> create table testalter_tbl
-> (
-> i INT,
-> c CHAR(1)
-> );
Query OK, 0 rows affected (0.05 sec)
mysql> SHOW COLUMNS FROM testalter_tbl;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| i | int(11) | YES | | NULL | |
| c | char(1) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
列の削除、追加、または再配置
上記のMySQLテーブルから既存の列iを削除する場合は、 DROP と一緒に条項 ALTER 以下に示すコマンド-
mysql> ALTER TABLE testalter_tbl DROP i;
A DROP 列がテーブルに残っている唯一の場合、句は機能しません。
列を追加するには、ADDを使用して列定義を指定します。次のステートメントは、i testalter_tblへの列-
mysql> ALTER TABLE testalter_tbl ADD i INT;
このステートメントを発行した後、testalterには、最初にテーブルを作成したときと同じ2つの列が含まれますが、同じ構造にはなりません。これは、デフォルトでテーブルの最後に追加される新しい列があるためです。だからi 元々はmytblの最初の列でしたが、現在は最後の列です。
mysql> SHOW COLUMNS FROM testalter_tbl;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| c | char(1) | YES | | NULL | |
| i | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
テーブル内の特定の位置に列が必要であることを示すには、FIRSTを使用して最初の列にするか、 AFTER col_name 新しい列をcol_nameの後に配置する必要があることを示します。
次を試してください ALTER TABLE ステートメント、使用 SHOW COLUMNS それぞれの後に、それぞれがどのような効果をもたらすかを確認します-
ALTER TABLE testalter_tbl DROP i;
ALTER TABLE testalter_tbl ADD i INT FIRST;
ALTER TABLE testalter_tbl DROP i;
ALTER TABLE testalter_tbl ADD i INT AFTER c;
FIRSTおよびAFTER指定子は、ADD句でのみ機能します。つまり、テーブル内の既存の列を再配置する場合は、最初にDROP それから ADD 新しい位置にあります。
列定義または名前の変更(変更)
列の定義を変更するには、 MODIFY または CHANGE ALTERコマンドとともに句。
たとえば、列を変更するには c CHAR(1)からCHAR(10)まで、次のコマンドを使用できます-
mysql> ALTER TABLE testalter_tbl MODIFY c CHAR(10);
と CHANGE、構文は少し異なります。CHANGEキーワードの後に、変更する列に名前を付けてから、新しい名前を含む新しい定義を指定します。
次の例を試してください-
mysql> ALTER TABLE testalter_tbl CHANGE i j BIGINT;
CHANGEを使用して変換する場合 j から BIGINT 戻る INT 列名を変更しない場合、ステートメントは次のようになります-
mysql> ALTER TABLE testalter_tbl CHANGE j j INT;
The Effect of ALTER TABLE on Null and Default Value Attributes−列を変更または変更する場合、列にNULL値を含めることができるかどうか、およびそのデフォルト値を指定することもできます。実際、これを行わないと、MySQLはこれらの属性に値を自動的に割り当てます。
次のコードブロックは例です。 NOT NULL 列の値はデフォルトで100になります。
mysql> ALTER TABLE testalter_tbl
-> MODIFY j BIGINT NOT NULL DEFAULT 100;
上記のコマンドを使用しない場合、MySQLはすべての列にNULL値を入力します。
列のデフォルト値の変更(変更)
を使用して、任意の列のデフォルト値を変更できます。 ALTER コマンド。
次の例を試してください。
mysql> ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
mysql> SHOW COLUMNS FROM testalter_tbl;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| c | char(1) | YES | | NULL | |
| i | int(11) | YES | | 1000 | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
DROP句を使用して、任意の列からデフォルトの制約を削除できます。 ALTER コマンド。
mysql> ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
mysql> SHOW COLUMNS FROM testalter_tbl;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| c | char(1) | YES | | NULL | |
| i | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
テーブルタイプの変更(変更)
を使用してテーブルタイプを使用できます TYPEALTERコマンドとともに句。次の例を試して、testalter_tbl に MYISAM テーブルタイプ。
テーブルの現在のタイプを確認するには、 SHOW TABLE STATUS ステートメント。
mysql> ALTER TABLE testalter_tbl TYPE = MYISAM;
mysql> SHOW TABLE STATUS LIKE 'testalter_tbl'\G
*************************** 1. row ****************
Name: testalter_tbl
Type: MyISAM
Row_format: Fixed
Rows: 0
Avg_row_length: 0
Data_length: 0
Max_data_length: 25769803775
Index_length: 1024
Data_free: 0
Auto_increment: NULL
Create_time: 2007-06-03 08:04:36
Update_time: 2007-06-03 08:04:36
Check_time: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
テーブルの名前の変更(変更)
テーブルの名前を変更するには、 RENAME のオプション ALTER TABLE ステートメント。
次の例を試して名前を変更してください testalter_tbl に alter_tbl。
mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl;
ALTERコマンドを使用して、MySQLファイルにINDEXコマンドを作成してドロップできます。このコマンドについては、次の章で詳しく説明します。
データベースインデックスは、テーブル内の操作の速度を向上させるデータ構造です。インデックスは1つ以上の列を使用して作成でき、迅速なランダムルックアップとレコードへのアクセスの効率的な順序付けの両方の基礎を提供します。
インデックスを作成するときは、SQLクエリを作成し、それらの列に1つ以上のインデックスを作成するためにどのすべての列を使用するかを考慮する必要があります。
実際には、インデックスはテーブルの一種でもあり、主キーまたはインデックスフィールドと、各レコードへのポインタを実際のテーブルに保持します。
ユーザーはインデックスを表示できません。インデックスはクエリを高速化するために使用され、データベース検索エンジンによってレコードを非常に高速に検索するために使用されます。
INSERTステートメントとUPDATEステートメントは、インデックスを持つテーブルでは時間がかかりますが、SELECTステートメントはこれらのテーブルで高速になります。その理由は、挿入または更新を実行している間、データベースはインデックス値も挿入または更新する必要があるためです。
シンプルでユニークなインデックス
テーブルに一意のインデックスを作成できます。一意のインデックスは、2つの行が同じインデックス値を持つことができないことを意味します。テーブルにインデックスを作成するための構文は次のとおりです。
CREATE UNIQUE INDEX index_name ON table_name ( column1, column2,...);
1つ以上の列を使用してインデックスを作成できます。
たとえば、インデックスを作成できます tutorials_tbl を使用して tutorial_author。
CREATE UNIQUE INDEX AUTHOR_INDEX ON tutorials_tbl (tutorial_author)
テーブルに簡単なインデックスを作成できます。省略してくださいUNIQUEクエリからのキーワードを使用して、単純なインデックスを作成します。単純なインデックスでは、テーブル内の値を重複させることができます。
列の値に降順でインデックスを付ける場合は、列名の後に予約語DESCを追加できます。
mysql> CREATE UNIQUE INDEX AUTHOR_INDEX ON tutorials_tbl (tutorial_author DESC)
INDEXを追加および削除するALTERコマンド
テーブルにインデックスを追加するためのステートメントには4つのタイプがあります-
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list) −このステートメントは PRIMARY KEY、つまり、インデックス付きの値は一意である必要があり、NULLにすることはできません。
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list) −このステートメントは、値が一意である必要があるインデックスを作成します(NULL値は複数回表示される場合があります)。
ALTER TABLE tbl_name ADD INDEX index_name (column_list) −これにより、任意の値が複数回表示される可能性のある通常のインデックスが追加されます。
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list) −これにより、テキスト検索の目的で使用される特別なFULLTEXTインデックスが作成されます。
次のコードブロックは、既存のテーブルにインデックスを追加する例です。
mysql> ALTER TABLE testalter_tbl ADD INDEX (c);
を使用して、任意のINDEXを削除できます。 DROP ALTERコマンドとともに句。
次の例を試して、上記で作成したインデックスを削除してください。
mysql> ALTER TABLE testalter_tbl DROP INDEX (c);
DROP句をALTERコマンドと一緒に使用すると、任意のINDEXを削除できます。
PRIMARYKEYを追加および削除するALTERコマンド
同じ方法で主キーを追加することもできます。ただし、主キーがNULLではない列で機能することを確認してください。
次のコードブロックは、既存のテーブルに主キーを追加する例です。これにより、最初に列がNOT NULLになり、次に主キーとして追加されます。
mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
次のように、ALTERコマンドを使用して主キーを削除できます。
mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;
PRIMARY KEY以外のインデックスを削除するには、インデックス名を指定する必要があります。
INDEX情報の表示
あなたは使用することができます SHOW INDEXテーブルに関連付けられているすべてのインデックスを一覧表示するコマンド。垂直形式の出力(\ Gで指定)は、長い行の折り返しを回避するために、このステートメントで役立つことがよくあります。
次の例を試してください-
mysql> SHOW INDEX FROM table_name\G
........
一時テーブルは、一時データを保持するのに非常に役立つ場合があります。一時テーブルについて知っておくべき最も重要なことは、現在のクライアントセッションが終了するとテーブルが削除されることです。
一時テーブルとは何ですか?
一時テーブルは、MySQLバージョン3.23で追加されました。3.23より古いバージョンのMySQLを使用している場合、一時テーブルは使用できませんが、使用できます。Heap Tables。
前に述べたように、一時テーブルはセッションが存続している間だけ存続します。PHPスクリプトでコードを実行する場合、スクリプトの実行が終了すると、一時テーブルは自動的に破棄されます。MySQLクライアントプログラムを介してMySQLデータベースサーバーに接続している場合、クライアントを閉じるか手動でテーブルを破棄するまで、一時テーブルは存在します。
例
次のプログラムは、一時テーブルの使用法を示す例です。同じコードをPHPスクリプトで使用できます。mysql_query() 関数。
mysql> CREATE TEMPORARY TABLE SalesSummary (
-> product_name VARCHAR(50) NOT NULL
-> , total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00
-> , avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00
-> , total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
);
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO SalesSummary
-> (product_name, total_sales, avg_unit_price, total_units_sold)
-> VALUES
-> ('cucumber', 100.25, 90, 2);
mysql> SELECT * FROM SalesSummary;
+--------------+-------------+----------------+------------------+
| product_name | total_sales | avg_unit_price | total_units_sold |
+--------------+-------------+----------------+------------------+
| cucumber | 100.25 | 90.00 | 2 |
+--------------+-------------+----------------+------------------+
1 row in set (0.00 sec)
あなたが発行するとき SHOW TABLESコマンドを実行すると、一時テーブルはリストに表示されません。ここで、MySQLセッションからログアウトしてから、SELECTコマンドを実行すると、データベースに使用可能なデータが見つかりません。一時テーブルも存在しません。
一時テーブルの削除
デフォルトでは、データベース接続が終了すると、MySQLによってすべての一時テーブルが削除されます。それでも、間にそれらを削除したい場合は、を発行して削除しますDROP TABLE コマンド。
次のプログラムは、一時テーブルを削除する例です。
mysql> CREATE TEMPORARY TABLE SalesSummary (
-> product_name VARCHAR(50) NOT NULL
-> , total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00
-> , avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00
-> , total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
);
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO SalesSummary
-> (product_name, total_sales, avg_unit_price, total_units_sold)
-> VALUES
-> ('cucumber', 100.25, 90, 2);
mysql> SELECT * FROM SalesSummary;
+--------------+-------------+----------------+------------------+
| product_name | total_sales | avg_unit_price | total_units_sold |
+--------------+-------------+----------------+------------------+
| cucumber | 100.25 | 90.00 | 2 |
+--------------+-------------+----------------+------------------+
1 row in set (0.00 sec)
mysql> DROP TABLE SalesSummary;
mysql> SELECT * FROM SalesSummary;
ERROR 1146: Table 'TUTORIALS.SalesSummary' doesn't exist
テーブルの正確なコピーが必要な場合があります。 CREATE TABLE ... SELECT コピーには同じインデックスやデフォルト値などが含まれている必要があるため、目的に適合しません。
以下の手順に従って、この状況に対処できます。
SHOW CREATE TABLEを使用して、ソーステーブルの構造、インデックス、およびすべてを指定するCREATETABLEステートメントを取得します。
ステートメントを変更して、テーブル名をクローンテーブルの名前に変更し、ステートメントを実行します。このようにして、正確なクローンテーブルが作成されます。
オプションで、テーブルの内容もコピーする必要がある場合は、INSERT INTO ... SELECTステートメントも発行します。
例
次の例を試して、のクローンテーブルを作成してください tutorials_tbl。
Step 1 −テーブルに関する完全な構造を取得します。
mysql> SHOW CREATE TABLE tutorials_tbl \G;
*************************** 1. row ***************************
Table: tutorials_tbl
Create Table: CREATE TABLE `tutorials_tbl` (
`tutorial_id` int(11) NOT NULL auto_increment,
`tutorial_title` varchar(100) NOT NULL default '',
`tutorial_author` varchar(40) NOT NULL default '',
`submission_date` date default NULL,
PRIMARY KEY (`tutorial_id`),
UNIQUE KEY `AUTHOR_INDEX` (`tutorial_author`)
) TYPE = MyISAM
1 row in set (0.00 sec)
ERROR:
No query specified
Step 2 −このテーブルの名前を変更し、別のテーブルを作成します。
mysql> CREATE TABLE clone_tbl (
-> tutorial_id int(11) NOT NULL auto_increment,
-> tutorial_title varchar(100) NOT NULL default '',
-> tutorial_author varchar(40) NOT NULL default '',
-> submission_date date default NULL,
-> PRIMARY KEY (tutorial_id),
-> UNIQUE KEY AUTHOR_INDEX (tutorial_author)
-> ) TYPE = MyISAM;
Query OK, 0 rows affected (1.80 sec)
Step 3−手順2を実行した後、データベースにクローンテーブルを作成します。古いテーブルからデータをコピーする場合は、INSERT INTO ... SELECTステートメントを使用してコピーできます。
mysql> INSERT INTO clone_tbl (tutorial_id,
-> tutorial_title,
-> tutorial_author,
-> submission_date)
-> SELECT tutorial_id,tutorial_title,
-> tutorial_author,submission_date
-> FROM tutorials_tbl;
Query OK, 3 rows affected (0.07 sec)
Records: 3 Duplicates: 0 Warnings: 0
最後に、必要に応じて正確なクローンテーブルを作成します。
MySQLメタデータの取得と使用
MySQLから取得したい情報には3つのタイプがあります。
Information about the result of queries −これには、SELECT、UPDATE、またはDELETEステートメントの影響を受けるレコードの数が含まれます。
Information about the tables and databases −これには、テーブルとデータベースの構造に関する情報が含まれます。
Information about the MySQL server −これには、データベースサーバーのステータス、バージョン番号などが含まれます。
MySQLプロンプトでこれらすべての情報を取得するのは非常に簡単ですが、PERLまたはPHP APIを使用している間、このすべての情報を取得するには、さまざまなAPIを明示的に呼び出す必要があります。
クエリの影響を受ける行数の取得
この情報を取得する方法を見てみましょう。
PERLの例
DBIスクリプトでは、影響を受ける行数は do( ) またはによって execute( ) クエリの実行方法に応じて、コマンド。
# Method 1
# execute $query using do( )
my $count = $dbh->do ($query); # report 0 rows if an error occurred printf "%d rows were affected\n", (defined ($count) ? $count : 0); # Method 2 # execute query using prepare( ) plus execute( ) my $sth = $dbh->prepare ($query);
my $count = $sth->execute ( );
printf "%d rows were affected\n", (defined ($count) ? $count : 0);
PHPの例
PHPでは、 mysql_affected_rows( ) クエリが変更された行数を調べる関数。
$result_id = mysql_query ($query, $conn_id); # report 0 rows if the query failed $count = ($result_id ? mysql_affected_rows ($conn_id) : 0);
print ("$count rows were affected\n");
テーブルとデータベースの一覧表示
データベースサーバーで使用可能なすべてのデータベースとテーブルを一覧表示するのは非常に簡単です。あなたの結果はnull 十分な権限がない場合。
次のコードブロックに示されている方法とは別に、次のコードブロックを使用できます。 SHOW TABLES または SHOW DATABASES PHPまたはPERLのいずれかでテーブルまたはデータベースのリストを取得するためのクエリ。
PERLの例
# Get all the tables available in current database.
my @tables = $dbh->tables ( );
foreach $table (@tables ){ print "Table Name $table\n";
}
PHPの例
<?php
$con = mysql_connect("localhost", "userid", "password"); if (!$con) {
die('Could not connect: ' . mysql_error());
}
$db_list = mysql_list_dbs($con);
while ($db = mysql_fetch_object($db_list)) {
echo $db->Database . "<br />"; } mysql_close($con);
?>
サーバーメタデータの取得
MySQLには、MySQLプロンプトで実行するか、PHPなどのスクリプトを使用してデータベースサーバーに関するさまざまな重要な情報を取得することで実行できる重要なコマンドがいくつかあります。
シニア番号 | コマンドと説明 |
---|---|
1 | SELECT VERSION( ) サーバーバージョン文字列 |
2 | SELECT DATABASE( ) 現在のデータベース名(ない場合は空) |
3 | SELECT USER( ) 現在のユーザー名 |
4 | SHOW STATUS サーバーステータスインジケーター |
5 | SHOW VARIABLES サーバー構成変数 |
シーケンスは、特定の要求に応じて順番に生成される整数1、2、3、...のセットです。多くのアプリケーションではテーブルの各行に一意の値を含める必要があり、シーケンスを使用するとシーケンスを簡単に生成できるため、シーケンスはデータベースで頻繁に使用されます。
この章では、MySQLでシーケンスを使用する方法について説明します。
AUTO_INCREMENT列の使用
MySQLでSequencesを使用する最も簡単な方法は、列を次のように定義することです。 AUTO_INCREMENT 残りはMySQLに任せてください。
例
次の例を試してください。これによりテーブルが作成され、その後、MySQLによって自動インクリメントされるため、レコードIDを指定する必要がないこのテーブルにいくつかの行が挿入されます。
mysql> CREATE TABLE insect
-> (
-> id INT UNSIGNED NOT NULL AUTO_INCREMENT,
-> PRIMARY KEY (id),
-> name VARCHAR(30) NOT NULL, # type of insect
-> date DATE NOT NULL, # date collected
-> origin VARCHAR(30) NOT NULL # where collected
);
Query OK, 0 rows affected (0.02 sec)
mysql> INSERT INTO insect (id,name,date,origin) VALUES
-> (NULL,'housefly','2001-09-10','kitchen'),
-> (NULL,'millipede','2001-09-10','driveway'),
-> (NULL,'grasshopper','2001-09-10','front yard');
Query OK, 3 rows affected (0.02 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM insect ORDER BY id;
+----+-------------+------------+------------+
| id | name | date | origin |
+----+-------------+------------+------------+
| 1 | housefly | 2001-09-10 | kitchen |
| 2 | millipede | 2001-09-10 | driveway |
| 3 | grasshopper | 2001-09-10 | front yard |
+----+-------------+------------+------------+
3 rows in set (0.00 sec)
AUTO_INCREMENT値を取得する
ザ・ LAST_INSERT_ID( )はSQL関数であるため、SQLステートメントの発行方法を理解している任意のクライアント内から使用できます。それ以外の場合、PERLおよびPHPスクリプトは、最後のレコードの自動インクリメント値を取得するための排他的な関数を提供します。
PERLの例
使用 mysql_insertid 取得する属性 AUTO_INCREMENTクエリによって生成された値。この属性には、クエリの発行方法に応じて、データベースハンドルまたはステートメントハンドルのいずれかを介してアクセスします。
次の例では、データベースハンドルを介してそれを参照しています。
$dbh->do ("INSERT INTO insect (name,date,origin) VALUES('moth','2001-09-14','windowsill')"); my $seq = $dbh->{mysql_insertid};
PHPの例
AUTO_INCREMENT値を生成するクエリを発行した後、を呼び出して値を取得します mysql_insert_id( ) コマンド。
mysql_query ("INSERT INTO insect (name,date,origin)
VALUES('moth','2001-09-14','windowsill')", $conn_id);
$seq = mysql_insert_id ($conn_id);
既存のシーケンスの番号を付け直す
テーブルから多くのレコードを削除し、すべてのレコードを再シーケンスしたい場合があります。これは簡単なトリックを使用して実行できますが、テーブルが他のテーブルと結合している場合は、慎重に行う必要があります。
AUTO_INCREMENT列の再シーケンスが避けられないと判断した場合、その方法は、テーブルから列を削除してから、再度追加することです。
次の例は、番号を付け直す方法を示しています id values このテクニックを使用してテーブルに。
mysql> ALTER TABLE insect DROP id;
mysql> ALTER TABLE insect
-> ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
-> ADD PRIMARY KEY (id);
特定の値でシーケンスを開始する
デフォルトでは、MySQLは1からシーケンスを開始しますが、テーブルの作成時に他の番号を指定することもできます。
次のプログラムは、MySQLが100からシーケンスを開始する方法を示す例です。
mysql> CREATE TABLE insect
-> (
-> id INT UNSIGNED NOT NULL AUTO_INCREMENT = 100,
-> PRIMARY KEY (id),
-> name VARCHAR(30) NOT NULL, # type of insect
-> date DATE NOT NULL, # date collected
-> origin VARCHAR(30) NOT NULL # where collected
);
または、テーブルを作成してから、で初期シーケンス値を設定することもできます。 ALTER TABLE コマンド。
mysql> ALTER TABLE t AUTO_INCREMENT = 100;
一般に、テーブルまたは結果セットに重複するレコードが含まれる場合があります。ほとんどの場合許可されますが、重複するレコードを停止する必要がある場合もあります。重複するレコードを識別し、それらをテーブルから削除する必要があります。この章では、テーブル内で重複レコードが発生しないようにする方法と、既存の重複レコードを削除する方法について説明します。
テーブル内での重複の発生の防止
あなたは使用することができます PRIMARY KEY または UNIQUE 重複レコードを停止するには、適切なフィールドを使用してテーブルにインデックスを付けます。
例を見てみましょう–次の表にはそのようなインデックスや主キーが含まれていないため、次のレコードの重複が許可されます。 first_name そして last_name。
CREATE TABLE person_tbl (
first_name CHAR(20),
last_name CHAR(20),
sex CHAR(10)
);
同じ姓名の値を持つ複数のレコードがこのテーブルに作成されないようにするには、 PRIMARY KEYその定義に。これを行うときは、インデックス付きの列を次のように宣言する必要もあります。NOT NULL、なぜなら PRIMARY KEY 許可しない NULL 値-
CREATE TABLE person_tbl (
first_name CHAR(20) NOT NULL,
last_name CHAR(20) NOT NULL,
sex CHAR(10),
PRIMARY KEY (last_name, first_name)
);
通常、テーブルに一意のインデックスが存在すると、インデックスを定義する1つまたは複数の列の既存のレコードと重複するレコードをテーブルに挿入すると、エラーが発生します。
使用 INSERT IGNORE コマンドではなくコマンド INSERTコマンド。レコードが既存のレコードと重複しない場合、MySQLは通常どおりそのレコードを挿入します。レコードが重複している場合、IGNORE キーワードは、エラーを生成せずにサイレントに破棄するようにMySQLに指示します。
次の例ではエラーが発生せず、同時に重複レコードも挿入されません。
mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
-> VALUES( 'Jay', 'Thomas');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
-> VALUES( 'Jay', 'Thomas');
Query OK, 0 rows affected (0.00 sec)
使用 REPLACEINSERTコマンドではなくコマンド。レコードが新しい場合は、INSERTと同じように挿入されます。重複している場合は、新しいレコードが古いレコードを置き換えます。
mysql> REPLACE INTO person_tbl (last_name, first_name)
-> VALUES( 'Ajay', 'Kumar');
Query OK, 1 row affected (0.00 sec)
mysql> REPLACE INTO person_tbl (last_name, first_name)
-> VALUES( 'Ajay', 'Kumar');
Query OK, 2 rows affected (0.00 sec)
INSERT IGNOREコマンドとREPLACEコマンドは、実行する重複処理動作に従って選択する必要があります。INSERT IGNOREコマンドは、複製されたレコードの最初のセットを保持し、残りを破棄します。REPLACEコマンドは、重複の最後のセットを保持し、以前の重複を消去します。
一意性を強制する別の方法は、 UNIQUE テーブルへのPRIMARYKEYではなくインデックス。
CREATE TABLE person_tbl (
first_name CHAR(20) NOT NULL,
last_name CHAR(20) NOT NULL,
sex CHAR(10)
UNIQUE (last_name, first_name)
);
重複のカウントと識別
以下は、テーブル内のfirst_nameとlast_nameを持つ重複レコードをカウントするためのクエリです。
mysql> SELECT COUNT(*) as repetitions, last_name, first_name
-> FROM person_tbl
-> GROUP BY last_name, first_name
-> HAVING repetitions > 1;
このクエリは、person_tblテーブル内のすべての重複レコードのリストを返します。一般に、重複する値のセットを識別するには、以下の手順に従います。
重複する可能性のある値が含まれている列を特定します。
それらの列を、列選択リストに、 COUNT(*)。
の列を一覧表示します GROUP BY 条項も。
追加する HAVING グループ数を1より大きくすることを要求することにより、一意の値を削除する句。
クエリ結果からの重複の排除
あなたは使用することができます DISTINCT SELECTステートメントとともにコマンドを実行して、テーブルで使用可能な一意のレコードを検索します。
mysql> SELECT DISTINCT last_name, first_name
-> FROM person_tbl
-> ORDER BY last_name;
DISTINCTコマンドの代わりに、選択している列に名前を付けるGROUPBY句を追加することもできます。これには、重複を削除し、指定した列の値の一意の組み合わせのみを選択する効果があります。
mysql> SELECT last_name, first_name
-> FROM person_tbl
-> GROUP BY (last_name, first_name);
テーブル置換を使用した重複の削除
テーブルに重複レコードがあり、そのテーブルからすべての重複レコードを削除する場合は、以下の手順に従います。
mysql> CREATE TABLE tmp SELECT last_name, first_name, sex
-> FROM person_tbl;
-> GROUP BY (last_name, first_name);
mysql> DROP TABLE person_tbl;
mysql> ALTER TABLE tmp RENAME TO person_tbl;
テーブルから重複レコードを削除する簡単な方法は、そのテーブルにINDEXまたはPRIMARYKEYを追加することです。このテーブルがすでに利用可能である場合でも、この手法を使用して重複レコードを削除することができ、将来的にも安全になります。
mysql> ALTER IGNORE TABLE person_tbl
-> ADD PRIMARY KEY (last_name, first_name);
Webページからユーザー入力を取得してMySQLデータベースに挿入すると、次のようなセキュリティの問題が発生する可能性があります。 SQL Injection。この章では、これを防ぐ方法と、スクリプトとMySQLステートメントを保護する方法について説明します。
SQLインジェクションは通常、ユーザーに名前などの入力を求めるときに発生し、名前の代わりに、データベースで無意識のうちに実行するMySQLステートメントをユーザーに提供します。
ユーザーから提供されたデータを決して信頼せず、検証後にのみこのデータを処理してください。原則として、これはパターンマッチングによって行われます。次の例では、ユーザー名は英数字とアンダースコア、および8〜20文字の長さに制限されています。必要に応じてこれらのルールを変更してください。
if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)) { $result = mysql_query("SELECT * FROM users WHERE username = $matches[0]");
} else {
echo "username not accepted";
}
この問題を実証するために、次の抜粋を検討してください。
// supposed input
$name = "Qadir'; DELETE FROM users;";
mysql_query("SELECT * FROM users WHERE name = '{$name}'");
関数呼び出しは、usersテーブルからレコードを取得することになっています。ここで、name列はユーザーが指定した名前と一致します。通常の状況では、$ nameには英数字とおそらくスペースのみが含まれます。しかし、ここでは、まったく新しいクエリをに追加することによって$name、データベースへの呼び出しは災害に変わります。挿入されたDELETEクエリは、ユーザーからすべてのレコードを削除します。
幸い、MySQLを使用している場合、 mysql_query()関数では、1回の関数呼び出しでクエリをスタックしたり複数のクエリを実行したりすることはできません。クエリをスタックしようとすると、呼び出しは失敗します。
ただし、他のPHPデータベース拡張機能( SQLite そして PostgreSQL、スタッククエリを問題なく実行し、1つの文字列で提供されるすべてのクエリを実行し、深刻なセキュリティ問題を引き起こします。
SQLインジェクションの防止
PERLやPHPなどのスクリプト言語では、すべてのエスケープ文字をスマートに処理できます。PHP用のMySQL拡張機能は機能を提供しますmysql_real_escape_string() MySQLに固有の入力文字をエスケープします。
if (get_magic_quotes_gpc()) {
$name = stripslashes($name); } $name = mysql_real_escape_string($name); mysql_query("SELECT * FROM users WHERE name = '{$name}'");
LIKE Quandary
LIKEの難問に対処するには、カスタムエスケープメカニズムで、ユーザーが指定した%文字と_文字をリテラルに変換する必要があります。使用するaddcslashes()、エスケープする文字範囲を指定できる関数。
$sub = addcslashes(mysql_real_escape_string("%something_"), "%_"); // $sub == \%something\_
mysql_query("SELECT * FROM messages WHERE subject LIKE '{$sub}%'");
テーブルデータをテキストファイルにエクスポートする最も簡単な方法は、 SELECT...INTO OUTFILE クエリ結果をサーバーホスト上のファイルに直接エクスポートするステートメント。
SELECT ... INTOOUTFILEステートメントを使用したデータのエクスポート
このステートメントの構文は、通常の SELECT とのコマンド INTO OUTFILE filename最後に。デフォルトの出力形式は、LOADDATAコマンドの場合と同じです。したがって、次のステートメントは、tutorials_tbl テーブルに /tmp/tutorials.txt タブ区切りの改行で終了するファイルとして。
mysql> SELECT * FROM tutorials_tbl
-> INTO OUTFILE '/tmp/tutorials.txt';
さまざまなオプションを使用して出力形式を変更し、列とレコードを引用および区切る方法を示すことができます。tutorial_tblテーブルをCRLFで終了する行を含むCSV形式でエクスポートするには、次のコードを使用します。
mysql> SELECT * FROM passwd INTO OUTFILE '/tmp/tutorials.txt'
-> FIELDS TERMINATED BY ',' ENCLOSED BY '"'
-> LINES TERMINATED BY '\r\n';
ザ・ SELECT ... INTO OUTFILE 次のプロパティがあります-
出力ファイルはMySQLサーバーによって直接作成されるため、ファイル名はサーバーホスト上のファイルの書き込み先を示す必要があります。に類似したステートメントのローカルバージョンはありませんLOCAL のバージョン LOAD DATA。
あなたは持っている必要があります MySQL FILE 実行する特権 SELECT ... INTO ステートメント。
出力ファイルはまだ存在していてはなりません。これにより、MySQLが重要なファイルを壊してしまうのを防ぎます。
サーバーホストにログインアカウントを持っているか、そのホストからファイルを取得するための何らかの方法が必要です。それ以外の場合は、SELECT ... INTO OUTFILE コマンドはおそらくあなたにとって価値がないでしょう。
UNIXでは、ファイルが作成されます world readableMySQLサーバーが所有しています。つまり、ファイルを読み取ることはできても、削除できない場合があります。
テーブルを生データとしてエクスポートする
ザ・ mysqldumpプログラムは、テーブルとデータベースをコピーまたはバックアップするために使用されます。テーブル出力を次のように書き込むことができます。Raw Datafile またはのセットとして INSERT テーブル内のレコードを再作成するステートメント。
テーブルをデータファイルとしてダンプするには、を指定する必要があります --tab MySQLサーバーがファイルを書き込むディレクトリを示すオプション。
たとえば、 tutorials_tbl からのテーブル TUTORIALS データベースをファイルに /tmp ディレクトリについては、以下のコマンドを使用してください。
$ mysqldump -u root -p --no-create-info \
--tab=/tmp tutorials tutorials_tbl
password ******
SQL形式でのテーブルの内容または定義のエクスポート
SQL形式のテーブルをファイルにエクスポートするには、以下に示すコマンドを使用します。
$ mysqldump -u root -p TUTORIALS tutorials_tbl > dump.txt
password ******
これにより、以下のような内容のファイルが作成されます。
-- MySQL dump 8.23
--
-- Host: localhost Database: TUTORIALS
---------------------------------------------------------
-- Server version 3.23.58
--
-- Table structure for table `tutorials_tbl`
--
CREATE TABLE tutorials_tbl (
tutorial_id int(11) NOT NULL auto_increment,
tutorial_title varchar(100) NOT NULL default '',
tutorial_author varchar(40) NOT NULL default '',
submission_date date default NULL,
PRIMARY KEY (tutorial_id),
UNIQUE KEY AUTHOR_INDEX (tutorial_author)
) TYPE = MyISAM;
--
-- Dumping data for table `tutorials_tbl`
--
INSERT INTO tutorials_tbl
VALUES (1,'Learn PHP','John Poul','2007-05-24');
INSERT INTO tutorials_tbl
VALUES (2,'Learn MySQL','Abdul S','2007-05-24');
INSERT INTO tutorials_tbl
VALUES (3,'JAVA Tutorial','Sanjay','2007-05-06');
複数のテーブルをダンプするには、それらすべてに名前を付け、その後にデータベース名引数を付けます。データベース全体をダンプするには、次のコードブロックに示すように、データベースにちなんでテーブルに名前を付けないでください。
$ mysqldump -u root -p TUTORIALS > database_dump.txt
password ******
ホストで使用可能なすべてのデータベースをバックアップするには、次のコードを使用します。
$ mysqldump -u root -p --all-databases > database_dump.txt
password ******
--all-databasesオプションは、MySQL3.23.12バージョンで使用できます。この方法は、データベースのバックアップ戦略を実装するために使用できます。
Copying Tables or Databases to Another Host
If you want to copy tables or databases from one MySQL server to another, then use the mysqldump with database name and table name.
Run the following command at the source host. This will dump the complete database into dump.txt file.
$ mysqldump -u root -p database_name table_name > dump.txt
password *****
You can copy complete database without using a particular table name as explained above.
Now, ftp dump.txt file on another host and use the following command. Before running this command, make sure you have created database_name on destination server.
$ mysql -u root -p database_name < dump.txt
password *****
Another way to accomplish this without using an intermediary file is to send the output of the mysqldump directly over the network to the remote MySQL server. If you can connect to both the servers from the host where the source database resides, use the following command (Make sure you have access on both the servers).
$ mysqldump -u root -p database_name \
| mysql -h other-host.com database_name
In mysqldump, half of the command connects to the local server and writes the dump output to the pipe. The remaining half of the command connects to the remote MySQL server on the other-host.com. It reads the pipe for input and sends each statement to the other-host.com server.
There are two simple ways in MySQL to load data into the MySQL database from a previously backed up file.
Importing Data with LOAD DATA
MySQL provides a LOAD DATA statement that acts as a bulk data loader. Here is an example statement that reads a file dump.txt from your current directory and loads it into the table mytbl in the current database.
mysql> LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl;
If the LOCAL keyword is not present, MySQL looks for the datafile on the server host using the looking into absolute pathname, which fully specifies the location of the file, beginning from the root of the filesystem. MySQL reads the file from the given location.
By default, LOAD DATA assumes that datafiles contain lines that are terminated by linefeeds (newlines) and that data values within a line are separated by tabs.
To specify a file format explicitly, use a FIELDS clause to describe the characteristics of fields within a line, and a LINES clause to specify the line-ending sequence. The following LOAD DATA statement specifies that the datafile contains values separated by colons and lines terminated by carriage returns and new line character.
mysql> LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl
-> FIELDS TERMINATED BY ':'
-> LINES TERMINATED BY '\r\n';
The LOAD DATA command assumes the columns in the datafile have the same order as the columns in the table. If that is not true, you can specify a list to indicate which table columns the datafile columns should be loaded into. Suppose your table has columns a, b, and c, but successive columns in the datafile correspond to columns b, c, and a.
You can load the file as shown in the following code block.
mysql> LOAD DATA LOCAL INFILE 'dump.txt'
-> INTO TABLE mytbl (b, c, a);
Importing Data with mysqlimport
MySQL also includes a utility program named mysqlimport that acts as a wrapper around LOAD DATA, so that you can load the input files directly from the command line.
To load data from the dump.txt into mytbl, use the following command at the UNIX prompt.
$ mysqlimport -u root -p --local database_name dump.txt
password *****
If you use mysqlimport, command-line options provide the format specifiers. The mysqlimport commands that correspond to the preceding two LOAD DATA statements looks as shown in the following code block.
$ mysqlimport -u root -p --local --fields-terminated-by = ":" \
--lines-terminated-by = "\r\n" database_name dump.txt
password *****
The order in which you specify the options doesn't matter for mysqlimport, except that they should all precede the database name.
The mysqlimport statement uses the --columns option to specify the column order −
$ mysqlimport -u root -p --local --columns=b,c,a \
database_name dump.txt
password *****
Handling Quotes and Special Characters
The FIELDS clause can specify other format options besides TERMINATED BY. By default, LOAD DATA assumes that values are unquoted and interprets the backslash (\) as an escape character for the special characters. To indicate the value quoting character explicitly, use the ENCLOSED BY command. MySQL will strip that character from the ends of data values during input processing. To change the default escape character, use ESCAPED BY.
When you specify ENCLOSED BY to indicate that quote characters should be stripped from data values, it is possible to include the quote character literally within data values by doubling it or by preceding it with the escape character.
For example, if the quote and escape characters are " and \, the input value "a""b\"c" will be interpreted as a"b"c.
For mysqlimport, the corresponding command-line options for specifying quote and escape values are --fields-enclosed-by and --fields-escaped-by.