MariaDB講座 / CREATE TABLEで表の構造を定義する
CREATE TABLEは、表の列、データ型、制約とキーを定義するSQLです。実行成功だけで設計どおりと判断せず、保存された定義と最初の一行を確認します。
一行が表す対象と列の役割を決める
スキーマはデータ構造の定義です。ここでは一行を一商品とし、識別子、名前、分類、価格と在庫を別々の列にします。すべてを一つの文字列に詰め込むと、計算や検証のたびに分解が必要になります。
product_idはINTの自動採番主キー、product_nameはVARCHAR(100)、categoryはVARCHAR(30)、priceはDECIMAL(10,2)、stockは既定値0のINTにします。文字列の100文字という上限は例であり、実際には入力仕様に合わせます。数値の負数を許すかどうかは型だけでは決まらず、制約も必要です。数値型と文字列型を合わせて検討します。
接続と既存の表を確認する
course_userで学習サーバーへ接続し、クライアント内で実行します。端末の外側にSQLを入力しないでください。
SELECT VERSION() AS server_version, DATABASE() AS selected_database; USE shopcourse; SELECT DATABASE() AS selected_database;
shopcourseを確認し、既存のproductsは残します。別名products_schema_labがないか調べます。
SHOW TABLES LIKE 'products_schema_lab';
存在する場合は内容と定義を確認します。正常例はUTF-8の.sqlファイルとしてSOURCEで実行できますが、意図した失敗例は別にして、途中エラーで後続が止まらないようにします。
完全な作成・追加例を実行する
次を順番に実行します。列定義や表の規則はカンマで区切り、最後に余分なカンマを置きません。
USE shopcourse;
CREATE TABLE products_schema_lab (
product_id INT NOT NULL AUTO_INCREMENT,
product_name VARCHAR(100) NOT NULL,
category VARCHAR(30) NOT NULL,
price DECIMAL(10,2) NOT NULL,
stock INT NOT NULL DEFAULT 0,
PRIMARY KEY (product_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO products_schema_lab (product_name, category, price)
VALUES ('Notebook', 'Stationery', 3500.00);
SHOW TABLES LIKE 'products_schema_lab';
DESCRIBE products_schema_lab;
SHOW CREATE TABLE products_schema_lab;
SELECT product_id, product_name, price, stock FROM products_schema_lab;
PRIMARY KEYは行の識別、AUTO_INCREMENTは値の生成で、別の役割です。InnoDBは保存処理を担当するエンジンで、後のトランザクション実習でも使います。utf8mb4と照合順序を明示して、環境の既定値への依存を減らしています。
INSERTではIDと在庫を省略しています。新規の表ならIDが1、名前がNotebook、価格が3500.00、在庫が0になります。列の省略が自動採番と既定値にどうつながるかを確認します。
定義の意味を読み取る
| 確認方法 | 読む場所 |
|---|---|
| DESCRIBE | Field、Type、Null、Key、Default、Extra |
| SHOW CREATE TABLE | 主キー、エンジン、文字セット、照合順序の全体 |
| SELECT | 保存した商品と既定在庫0 |
int(11)と表示されても11バイトでも11桁の整数範囲でもありません。版による表示の正規化があるため、字面ではなく型や制約の意味を比較します。SHOW CREATE TABLEは定義を記録できますが、商品行をバックアップするものではありません。
IF NOT EXISTSと構造変更の違い
正常例の後で実行します。
CREATE TABLE IF NOT EXISTS products_schema_lab (only_column INT); SHOW WARNINGS; DESCRIBE products_schema_lab;
元の五列が残り、only_column一列には変わりません。IF NOT EXISTSは既存表を残す指定で、定義を更新する機能ではありません。構造を変えるにはALTER TABLEによる移行を計画します。CREATE OR REPLACEで重複エラーだけを回避しようとすると、データ構造を置き換える危険があります。
エラーを確認して実習表だけを戻す
No database selectedはUSE、権限エラーはアカウントとshopcourseの権限、構文エラーはカンマ・括弧・セミコロンを調べます。表がある場合は、まず定義と行を見ます。
繰り返すときはSELECT DATABASE()とSHOW CREATE TABLEで、削除してよいproducts_schema_labであることを確認します。必要なデータを保存した場合だけ実行します。
DROP TABLE shopcourse.products_schema_lab;
DROP TABLEは定義と行を削除し、通常のROLLBACKでは戻りません。最初の商品実習のproducts表は削除対象ではありません。




