列に正の値のみを強制する制約を追加するにはどうすればよいですか。
次のmysqlステートメントを試しましたが、機能しません
create table test ( test_column integer CONSTRAINT blah > 0);
列に正の値のみを強制する制約を追加するにはどうすればよいですか。
次のmysqlステートメントを試しましたが、機能しません
create table test ( test_column integer CONSTRAINT blah > 0);
キーワードunsigned
を使用して、整数が「符号」を許可しないことを示します (つまり、正の値のみを指定できます)。
CREATE TABLE test (
test_column int(11) unsigned
);
数値データ型 (符号付きおよび符号なし) の詳細については、こちらを参照してください。
負の値の挿入を防ぐための実際の制約に関する限り、MySQL にはステートメントでCHECK
使用できる句がありますが、ドキュメントによると:CREATE TABLE
CHECK 句は解析されますが、すべてのストレージ エンジンによって無視されます。
参考までに、これをどのように使用するかを以下に示します(マニュアルに記載されているように、まったく問題なく実行されますが、何もしません)。
CREATE TABLE test (
test_column int(11) unsigned CHECK (test_column > 0)
);
更新(負の値を完全に拒否する)
いくつかのコメントから、負の値を含むクエリを完全に拒否し、設定しないようにしたい(列0
への通常のトランザクションと同様) ことに気付きました。unsigned
これを一般的に実行できる制約はありません (少なくとも私は知っています)。ただし、厳密モードをオンにすると (を使用してSTRICT_TRANS_TABLES
)、署名されていない列に負の値を挿入するクエリはエラーで失敗します (無効なenum
値などのその他のデータ挿入エラー)。
挿入コマンドの前に次のコマンドを実行してテストできます。
SET @@SESSION.sql_mode = 'STRICT_TRANS_TABLES';
そして、それがうまくいく場合は、MySQL構成を更新するか、sql-mode="STRICT_TRANS_TABLES"
使用することができますSET @@GLOBAL.sql_mode = 'STRICT_TRANS_TABLES';
(コマンドがグローバルなmysql構成に影響するかどうかはわかりませんSET
が、実際の構成ファイルを更新する方が良いかもしれません)。
unsigned
正の値のみを許可するために使用します。
CREATE TABLE hello
(
world int unsigned
);
行のコメントを外すと、次のようなエラーが表示されます:データの切り捨て: 行 1 の列 'world' の範囲外の値:
UNSIGNED INTEGER データ型を使用する必要があります。詳細については、ここをクリックしてください
これを修正する方法は、MySQL Server に符号なし整数を作成するように明示的に指示することです。
CREATE TABLE tbl_example (
example_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
example_num INT UNSIGNED NOT NULL,
example_text TEXT
PRIMARY KEY (`example_id`)
);