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表は削除対象ではありません。

関連する公式リファレンス