MySQL
テーブル作成
サーチ…
構文
CREATE TABLE table_name(column_name1のdata_type(サイズ)、column_name2のdata_type(サイズ)、column_name3のdata_type(サイズ)、....); //基本的なテーブルの作成
CREATE TABLE table_name [存在しない場合](column_name1 data_type(size)、column_name2 data_type(size)、column_name3 data_type(size)、....); //既存のテーブル作成チェック
CREATE [TEMPORARY] TABLE table_name [存在しない場合](column_name1 data_type(size)、column_name2 data_type(size)、column_name3 data_type(size)、....); //テンポラリテーブルの作成
テーブルを作成するnew_tbl [AS] SELECT * FROM orig_tbl; // SELECTからのテーブルの作成
備考
CREATE TABLE
ステートメントは、 ENGINE
指定で終わる必要があります。
CREATE TABLE table_name ( column_definitions ) ENGINE=engine;
いくつかのオプションがあります:
-
InnoDB
:(バージョン5.5.5以降のデフォルト)トランスフォームセーフ(ACID準拠)エンジンです。トランザクションのコミットとロールバック、およびクラッシュリカバリ機能と行レベルのロック機能を備えています。 -
MyISAM
:(バージョン5.5.5より前のデフォルト)これは普通の高速エンジンです。トランザクションや外部キーはサポートしていませんが、データウェアハウジングには便利です。 -
Memory
:非常に高速な操作のためにすべてのデータをRAMに格納しますが、データベースの再起動時にテーブルの日付が失われます。
基本的なテーブルの作成
CREATE TABLE
ステートメントは、MySQLデータベースにテーブルを作成するために使用されます。
CREATE TABLE Person (
`PersonID` INTEGER NOT NULL PRIMARY KEY,
`LastName` VARCHAR(80),
`FirstName` VARCHAR(80),
`Address` TEXT,
`City` VARCHAR(100)
) Engine=InnoDB;
すべてのフィールド定義には次のものが必要です。
- フィールド名:有効なフィールド名。 `-chars 'に名前を入れてください。これにより、fieldnameに例えばspace-charsを使用できるようになります。
- データ型[長さ]:フィールドが
CHAR
またはVARCHAR
場合は、フィールド長を指定することが必須です。 - 属性
NULL
|NOT NULL
:NOT NULL
を指定すると、そのフィールドにNULL
値を格納しようとすると失敗します。 - データ型とその属性の詳細を参照してくださいここに 。
Engine=...
は、テーブルのストレージエンジンを指定するためのオプションのパラメータです。ストレージエンジンが指定されていない場合、サーバのデフォルトテーブルストレージエンジン(通常はInnoDBまたはMyISAM)を使用してテーブルが作成されます。
デフォルト設定
さらに、 DEFAULT
を使用して各フィールドのデフォルト値を設定することができます。
CREATE TABLE Address (
`AddressID` INTEGER NOT NULL PRIMARY KEY,
`Street` VARCHAR(80),
`City` VARCHAR(80),
`Country` VARCHAR(80) DEFAULT "United States",
`Active` BOOLEAN DEFAULT 1,
) Engine=InnoDB;
挿入中にStreet
が指定されていない場合、そのフィールドは取り出されるとNULL
なります。挿入時にCountry
が指定されていない場合、デフォルトは "United States"になります。
BLOB
、 TEXT
、 GEOMETRY
、およびJSON
フィールドを除くすべての列タイプのデフォルト値を設定できます。
主キーによるテーブルの作成
CREATE TABLE Person (
PersonID INT UNSIGNED NOT NULL,
LastName VARCHAR(66) NOT NULL,
FirstName VARCHAR(66),
Address VARCHAR(255),
City VARCHAR(66),
PRIMARY KEY (PersonID)
);
主キーは、表の行を一意に識別するNOT NULL
単一または複数列のIDです。 インデックスが作成され、 NOT NULL
として明示的に宣言されていない場合、MySQLは暗黙的に暗黙に宣言します。
表にはPRIMARY KEY
は1つしかなく、各表には1つのPRIMARY KEY
があることが推奨されています。 InnoDBはこれが不在のときに自動的に作成します( MySQLのマニュアルに見られるように)。
しばしば、 "サロゲートキー"とも呼ばれるAUTO_INCREMENT
INT
は、細いインデックスの最適化や他のテーブルとの関係付けに使用されます。この値は、新しいレコードが追加されるたびに(通常は)1ずつ増加し、デフォルト値の1から始まります。
しかし、その名前にもかかわらず、価値が増分的であることを保証するのは目的ではなく、単なる逐次的かつユニークなものである。
TRUNCATE TABLE
文を使用して表を切り捨てない限り、表内のすべての行が削除されると、自動増分INT
値はデフォルトの開始値にリセットされません。
1つの列を主キー(インライン定義)として定義する
主キーが単一の列で構成されている場合、 PRIMARY KEY
句は列定義とともにインラインに配置できます。
CREATE TABLE Person (
PersonID INT UNSIGNED NOT NULL PRIMARY KEY,
LastName VARCHAR(66) NOT NULL,
FirstName VARCHAR(66),
Address VARCHAR(255),
City VARCHAR(66)
);
この形式のコマンドは短くて読みやすい。
複数列の主キーの定義
複数の列を含む主キーを定義することもできます。これは、例えば、外部キー関係の子テーブルで行うことができます。関与する列を別々のPRIMARY KEY
節にリストすることによって、複数列の主キーが定義されます。インライン構文はここでは許可されていません。これは、 PRIMARY KEY
インラインで宣言される列が1つだけであるためです。例えば:
CREATE TABLE invoice_line_items (
LineNum SMALLINT UNSIGNED NOT NULL,
InvoiceNum INT UNSIGNED NOT NULL,
-- Other columns go here
PRIMARY KEY (InvoiceNum, LineNum),
FOREIGN KEY (InvoiceNum) REFERENCES -- references to an attribute of a table
);
主キーの列は、論理ソート順で指定する必要があります。これは 、上の例のように、列が定義された順序とは異なる場合があります。
インデックスが大きくなると、ディスク領域、メモリ、およびI / Oが増えます。したがって、キーは可能な限り小さくする必要があります(特に合成キーに関して)。 InnoDBでは、すべての「セカンダリインデックス」には、 PRIMARY KEY
列のコピーが含まれています。
外部キーによるテーブルの作成
CREATE TABLE Account (
AccountID INT UNSIGNED NOT NULL,
AccountNo INT UNSIGNED NOT NULL,
PersonID INT UNSIGNED,
PRIMARY KEY (AccountID),
FOREIGN KEY (PersonID) REFERENCES Person (PersonID)
) ENGINE=InnoDB;
外部キー:外部キー( FK
)は、 参照テーブル内の列の単一列または複数列の複合です。このFK
は、 参照先テーブルに存在することが確認されています。 FK
確認する参照テーブルキーは主キーであるが、それは強制されないことを強くお勧めします。これは、一意である必要がない参照先へのファーストルックアップとして使用され、実際にそこで最も左のインデックスになることができます。
外部キーの関係には、中央データ値を保持する親テーブルと、その親を指す同じ値を持つ子テーブルがあります。 FOREIGN KEY句は、子テーブルに指定されています。親テーブルと子テーブルは、同じストレージエンジンを使用する必要があります。 TEMPORARYテーブルであってはなりません。
外部キーと参照キーの対応する列には、同様のデータ型が必要です。整数型のサイズと符号は同じでなければなりません。文字列型の長さは同じである必要はありません。非バイナリ(文字)文字列の場合、文字セットと照合は同じでなければなりません。
注意:外部キー制約は、InnoDBストレージエンジン(MyISAMまたはMEMORYではなく)でサポートされています。他のエンジンを使用するDBセットアップはこのCREATE TABLE
ステートメントを受け入れますが、外部キー制約を尊重しません。 (新しいMySQLのバージョンはデフォルトでInnoDB
になっていますが、明示的にすることをお勧めします)。
既存のテーブルのクローン作成
テーブルは次のように複製できます。
CREATE TABLE ClonedPersons LIKE Persons;
新しい表は、索引および列属性を含む元の表とまったく同じ構造を持ちます。
手動でテーブルを作成するだけでなく、別のテーブルからデータを選択してテーブルを作成することもできます。
CREATE TABLE ClonedPersons SELECT * FROM Persons;
SELECT
ステートメントの通常の機能のいずれかを使用して、データを変更することができます。
CREATE TABLE ModifiedPersons
SELECT PersonID, FirstName + LastName AS FullName FROM Persons
WHERE LastName IS NOT NULL;
SELECT
からテーブルを作成する場合、主キーとインデックスは保持されません。あなたはそれらを再宣言する必要があります:
CREATE TABLE ModifiedPersons (PRIMARY KEY (PersonID))
SELECT PersonID, FirstName + LastName AS FullName FROM Persons
WHERE LastName IS NOT NULL;
SELECTからのテーブルの作成
CREATE TABLE
ステートメントの最後にSELECT
ステートメントを追加することによって、別のテーブルを作成することができます。
CREATE TABLE stack (
id_user INT,
username VARCHAR(30),
password VARCHAR(30)
);
同じデータベースにテーブルを作成する:
-- create a table from another table in the same database with all attributes
CREATE TABLE stack2 AS SELECT * FROM stack;
-- create a table from another table in the same database with some attributes
CREATE TABLE stack3 AS SELECT username, password FROM stack;
異なるデータベースからテーブルを作成する:
-- create a table from another table from another database with all attributes
CREATE TABLE stack2 AS SELECT * FROM second_db.stack;
-- create a table from another table from another database with some attributes
CREATE TABLE stack3 AS SELECT username, password FROM second_db.stack;
NB
別のデータベースに存在する別のテーブルと同じテーブルを作成するには、次のようにデータベースの名前を指定する必要があります。
FROM NAME_DATABASE.name_table
テーブル構造を表示する
テーブルのスキーマ情報を表示するには、次のいずれかを使用します。
SHOW CREATE TABLE child; -- Option 1
CREATE TABLE `child` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`fullName` varchar(100) NOT NULL,
`myParent` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `mommy_daddy` (`myParent`),
CONSTRAINT `mommy_daddy` FOREIGN KEY (`myParent`) REFERENCES `parent` (`id`)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
mysqlコマンドラインツールから使用する場合、これはあまり冗長ではありません。
SHOW CREATE TABLE child \G
表の構造を示すための記述的ではない方法です。
mysql> CREATE TABLE Tab1(id int, name varchar(30));
Query OK, 0 rows affected (0.03 sec)
mysql> DESCRIBE Tab1; -- Option 2
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(30) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
DESCRIBEとDESCの両方で同じ結果が得られます。
一度にデータベース内のすべてのテーブルでDESCRIBE
実行するには、この例を参照してください。
タイムスタンプ列を使用してテーブルを作成し、最終更新を表示する
TIMESTAMP列には、行が最後に更新された時刻が表示されます。
CREATE TABLE `TestLastUpdate` (
`ID` INT NULL,
`Name` VARCHAR(50) NULL,
`Address` VARCHAR(50) NULL,
`LastUpdate` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
COMMENT='Last Update'
;