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への変更時には既存データに負の値がないか事前に確認してください。より堅牢なデータ管理を目指す場合は、アプリケーション側でのバリデーションと組み合わせることをおすすめします。
-
MySQLで英数字文字列から数字のみを基準に並べ替える方法
MySQLで英数字文字列から数字のみを基準に並べ替える方法「Adam_101」や「121John_567」のような英数字が混在した文字列から、数字の部分だけを基準にレコードを並べ替えたいケースはよくあります。MySQLでは、ORDER BY句とRIGHT()関数を組み合わせることで、このような並べ替えを簡単に実現できます。RIGHT()関数は、文字列の右端から指定した文字数を抽出する関数です。例えば「RIGHT(StudentCode, 3)」と記述すると、StudentCode列の値の末尾3文字が取得されます。これを並べ替えのキーとして指定することで、文字列中の数字部分を基準にソートが可能に
-
C言語における負の数の剰余演算(%演算子)の挙動を徹底解説
C言語では、負の数に対して剰余演算(%演算子、モジュロ)を行うと、結果の符号がどうなるのか気になる方も多いでしょう。実はC言語の剰余演算には明確なルールがあり、結果の符号は左側のオペランド(被除数)に依存します。本記事では、具体的なサンプルコードとその出力結果をもとに、この挙動をわかりやすく解説します。演算子の優先順位と評価の流れまず、% 演算子と / 演算子が混在した式の例を見てみましょう。この2つの演算子は優先順位が同じであるため、左から右へと評価されます。サンプルコード1#include<stdio.h> int main() { int a = 7, b = -10