MySQLデータベースにおける主キーの型: 符号付き vs 符号なし
符号付き主キーは、正の値と負の値の両方を格納できます。一方、符号なし主キーは正の値のみを格納できます。
一般的に、主キーは符号なしで定義することを推奨されています。その理由は以下の通りです。
値の範囲が広がる:
符号なし主キーは、符号付き主キーに比べて2倍の値を格納できます。例えば、INT
型の場合、符号付きでは-2147483648から2147483647までの値を格納できますが、符号なしでは0から4294967295までの値を格納できます。
自動インクリメントとの互換性:
多くの場合、主キーは自動インクリメント機能を用いて、新規行が追加されるたびに自動的に値が更新されます。自動インクリメントは常に正の値を生成するため、符号なし主キーの方が整合性が高くなります。
負の値の必要性:
実務において、主キーに負の値が必要となるケースは稀です。もしそのようなケースが存在する場合でも、別途の列で負の値を管理し、主キーは符号なしで定義しておく方が望ましいでしょう。
例外:
以下のような場合は、符号付き主キーを使用しても良い場合があります。
- 0を含まない負の値を格納する必要がある場合
-- 符号付き主キーの例
CREATE TABLE users (
user_id INT NOT NULL AUTO_INCREMENT,
username VARCHAR(255) NOT NULL UNIQUE,
email VARCHAR(255) NOT NULL UNIQUE,
PRIMARY KEY (user_id)
);
-- 符号なし主キーの例
CREATE TABLE products (
product_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
product_name VARCHAR(255) NOT NULL,
product_price DECIMAL(10,2) NOT NULL,
PRIMARY KEY (product_id)
);
上記のコードは、2つのテーブルを作成する例です。
users
テーブルは、ユーザー情報を格納するテーブルです。主キーはuser_id
列で、符号付き整型数で定義されています。products
テーブルは、商品情報を格納するテーブルです。主キーはproduct_id
列で、符号なしビッグ整型数で定義されています。
符号なし主キーを使用する場合は、UNSIGNED
キーワードをINT
またはBIGINT
データ型の後に追加する必要があります。
主キーとして文字列型を使用することは稀ですが、以下のような場合に有効です。
- 主キーとして人間が読みやすい値を使用したい場合
例:
CREATE TABLE orders (
order_id VARCHAR(36) NOT NULL PRIMARY KEY,
customer_id INT NOT NULL,
order_date DATE NOT NULL,
total_amount DECIMAL(10,2) NOT NULL
);
複合主キー
複数の列を組み合わせて主キーを定義することもできます。これは、複数の列の組み合わせでレコードを一意に識別したい場合に有効です。
CREATE TABLE customers (
customer_id INT NOT NULL,
first_name VARCHAR(255) NOT NULL,
last_name VARCHAR(255) NOT NULL,
PRIMARY KEY (customer_id, first_name, last_name)
);
自動生成される主キー
MySQLには、AUTO_INCREMENT
キーワードを使用して、自動的に主キー値を生成する機能があります。これは、新規行が追加されるたびに主キー値を1ずつ増やすというものです。
CREATE TABLE products (
product_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
product_name VARCHAR(255) NOT NULL,
product_price DECIMAL(10,2) NOT NULL
);
注意点:
- 主キーは、NULL値を含めることはできません。
- 主キーは、一意である必要があります。つまり、同じ値を持つレコードが2つ以上存在することはできません。
- 主キーは、インデックスが自動的に作成されます。
mysql database