How can we add a constraint which enforces a column to have only positive values.
Tried the following mysql statement but it doesn't work
create table test ( test_column integer CONSTRAINT blah > 0);
Run Code Online (Sandbox Code Playgroud)
new*_*rey 17
You would use the keyword unsigned
to signify that the integer doesn't allow a "sign" (i.e. - it can only be positive):
CREATE TABLE test (
test_column int(11) unsigned
);
Run Code Online (Sandbox Code Playgroud)
You can read more about the numeric data types (signed & unsigned) here.
As far as an actual constraint to prevent the insertion-of negative values, MySQL has a CHECK
clause that can be used in the CREATE TABLE
statement, however, according to the documentation:
The CHECK clause is parsed but ignored by all storage engines.
For reference, here is how you would use it (and though it will execute absolutely fine, it just does nothing - as the manual states):
CREATE TABLE test (
test_column int(11) unsigned CHECK (test_column > 0)
);
Run Code Online (Sandbox Code Playgroud)
UPDATE (rejecting negative values completely)
I've noticed from a few of your comments that you want queries with negative values to be completely rejected and not set to 0
(as a normal transaction into an unsigned
column would do). There is no constraint that can do this in-general (that I know of, at least), however, if you turn strict-mode on (with STRICT_TRANS_TABLES
) any query that inserts a negative value into an unsigned column will fail with an error (along with any-other data-insertion errors, such as an invalid enum
value).
You can test it by running the following command prior to your insert-commands:
SET @@SESSION.sql_mode = 'STRICT_TRANS_TABLES';
Run Code Online (Sandbox Code Playgroud)
And if it works for you, you can either update your MySQL config with sql-mode="STRICT_TRANS_TABLES"
or use SET @@GLOBAL.sql_mode = 'STRICT_TRANS_TABLES';
(I'm not sure if the SET
command will affect the global mysql config though, so it may be better to update the actual config-file).
从 MySQL 8.0.16 (MariaDB 10.2.1 ) 开始,强制执行CHECK
约束。(在早期版本中,约束表达式在语法中被接受但被忽略)。
因此,您可以使用:
CREATE TABLE test (
test_column INT CHECK (test_column > 0)
);
Run Code Online (Sandbox Code Playgroud)
或者
CREATE TABLE test (
test_column INT,
CONSTRAINT test_column_positive CHECK (test_column > 0)
);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
31547 次 |
最近记录: |