16

列に正の値のみを強制する制約を追加するにはどうすればよいですか。

次のmysqlステートメントを試しましたが、機能しません

create table test ( test_column integer CONSTRAINT blah > 0);
4

5 に答える 5

21

キーワード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が、実際の構成ファイルを更新する方が良いかもしれません)。

于 2012-11-05T03:14:50.870 に答える
0

unsigned正の値のみを許可するために使用します。

CREATE TABLE hello 
(
    world int unsigned
);

行のコメントを外すと、次のようなエラーが表示されます:データの切り捨て: 行 1 の列 'world' の範囲外の値:

于 2012-11-05T03:16:10.307 に答える
0

UNSIGNED INTEGER データ型を使用する必要があります。詳細については、ここをクリックしてください

于 2012-11-05T03:15:38.570 に答える
0

これを修正する方法は、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`) 
); 
于 2012-11-05T03:15:52.733 に答える