MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLで負の数を防ぐ方法|INT UNSIGNEDによるカラム制約の設定手順

MySQLでカラムに負の数(マイナス値)が登録されないようにするには、INT UNSIGNED型を使用します。本記事では、テーブルの作成から既存カラムの変更、実際に負の値を挿入してエラーが発生することの確認まで、具体例を交えて解説します。

INT UNSIGNEDとは

MySQLの整数型であるINTは、デフォルトでは符号付き(SIGNED)のため、-2147483648〜2147483647の範囲の値を扱えます。一方、UNSIGNEDを指定すると負の値が扱えなくなり、0〜4294967295の範囲に変わります。これにより、意図しない負の数の登録をデータベースレベルで防ぐことができます。ゲームのスコアや在庫数など、負にならない性質のデータに適しています。

サンプルテーブルの作成

まず、通常のINT型カラムを持つテーブル「preventNegativeNumberDemo」を作成します。

mysql> create table preventNegativeNumberDemo
    -> (
    -> UserId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> UserName varchar(20),
    -> UserGameScores int
    -> );
Query OK, 0 rows affected (1.74 sec)

ALTER TABLEでカラムをUNSIGNEDに変更する

既存のカラムに負の数を許可したくない場合は、ALTER TABLE文を使ってUserGameScoresカラムをINT UNSIGNEDに変更します。

mysql> alter table preventNegativeNumberDemo modify column UserGameScores INT UNSIGNED NOT NULL;
Query OK, 0 rows affected (3.32 sec)
Records: 0 Duplicates: 0 Warnings: 0

テーブル構造の確認

DESCコマンドでテーブル構造を確認してみましょう。

mysql> desc preventNegativeNumberDemo;

実行結果は以下の通りです。UserGameScoresカラムが「int(10) unsigned」に変更されていることがわかります。

+----------------+------------------+------+-----+---------+----------------+
| Field          | Type             | Null | Key | Default | Extra          |
+----------------+------------------+------+-----+---------+----------------+
| UserId         | int(11)          | NO   | PRI | NULL    | auto_increment |
| UserName       | varchar(20)      | YES  |     | NULL    |                |
| UserGameScores | int(10) unsigned | NO   |     | NULL    |                |
+----------------+------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

負の数を挿入した場合の動作

UNSIGNEDに設定されたカラムに負の数を挿入しようとすると、MySQLはエラーを返します。実際に正の値と負の値を含む複数のデータを挿入して確認してみます。

mysql> insert into preventNegativeNumberDemo(UserName,UserGameScores) values('Larry',0);
Query OK, 1 row affected (1.20 sec)
mysql> insert into preventNegativeNumberDemo(UserName,UserGameScores) values('Mike',-1);
ERROR 1264 (22003): Out of range value for column 'UserGameScores' at row 1
mysql> insert into preventNegativeNumberDemo(UserName,UserGameScores) values('Sam',-100);
ERROR 1264 (22003): Out of range value for column 'UserGameScores' at row 1
mysql> insert into preventNegativeNumberDemo(UserName,UserGameScores) values('John',100);
Query OK, 1 row affected (0.84 sec)
mysql> insert into preventNegativeNumberDemo(UserName,UserGameScores) values('Bob',200);
Query OK, 1 row affected (0.48 sec)

上記のように、-1や-100といった負の値を挿入しようとすると、「ERROR 1264 (22003): Out of range value」という範囲外エラーが発生し、挿入に失敗します。一方、0や100などの正の値は問題なく登録されます。

登録結果の確認

SELECT文ですべてのレコードを表示すると、正の値のみがテーブルに保存されていることが確認できます。

mysql> select *from preventNegativeNumberDemo;

実行結果は以下の通りです。

+--------+----------+----------------+
| UserId | UserName | UserGameScores |
+--------+----------+----------------+
|      1 | Larry    |              0 |
|      2 | John     |            100 |
|      3 | Bob      |            200 |
+--------+----------+----------------+
3 rows in set (0.00 sec)

まとめ

MySQLで負の数の登録を防ぐには、カラム定義にUNSIGNED属性を付けるのが最もシンプルで確実な方法です。CREATE TABLE時に指定できるのはもちろん、ALTER TABLEを使えば既存テーブルのカラムも後から変更できます。ただし、UNSIGNEDへの変更時には既存データに負の値がないか事前に確認してください。より堅牢なデータ管理を目指す場合は、アプリケーション側でのバリデーションと組み合わせることをおすすめします。

  1. MySQLで英数字文字列から数字のみを基準に並べ替える方法

    MySQLで英数字文字列から数字のみを基準に並べ替える方法「Adam_101」や「121John_567」のような英数字が混在した文字列から、数字の部分だけを基準にレコードを並べ替えたいケースはよくあります。MySQLでは、ORDER BY句とRIGHT()関数を組み合わせることで、このような並べ替えを簡単に実現できます。RIGHT()関数は、文字列の右端から指定した文字数を抽出する関数です。例えば「RIGHT(StudentCode, 3)」と記述すると、StudentCode列の値の末尾3文字が取得されます。これを並べ替えのキーとして指定することで、文字列中の数字部分を基準にソートが可能に

  2. C言語における負の数の剰余演算(%演算子)の挙動を徹底解説

    C言語では、負の数に対して剰余演算(%演算子、モジュロ)を行うと、結果の符号がどうなるのか気になる方も多いでしょう。実はC言語の剰余演算には明確なルールがあり、結果の符号は左側のオペランド(被除数)に依存します。本記事では、具体的なサンプルコードとその出力結果をもとに、この挙動をわかりやすく解説します。演算子の優先順位と評価の流れまず、% 演算子と / 演算子が混在した式の例を見てみましょう。この2つの演算子は優先順位が同じであるため、左から右へと評価されます。サンプルコード1#include<stdio.h> int main() { int a = 7, b = -10