16

我们如何添加一个强制列只有正值的约束。

尝试了以下mysql语句,但它不起作用

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

5 回答 5

21

您将使用关键字unsigned来表示整数不允许“符号”(即 - 它只能是正数):

CREATE TABLE test (
    test_column int(11) unsigned
);

您可以在此处阅读有关数字数据类型(有符号和无符号)的更多信息。

至于防止插入负值的实际约束CHECK,MySQL 有一个可以在CREATE TABLE语句中使用的子句,但是,根据文档:

CHECK 子句被解析,但被所有存储引擎忽略。

作为参考,这是您将如何使用它(虽然它会执行得非常好,但它什么也不做 - 正如手册所述):

CREATE TABLE test (
    test_column int(11) unsigned CHECK (test_column > 0)
);

更新(完全拒绝负值)
我从您的一些评论中注意到,您希望完全拒绝具有负值的查询并且不设置为0(就像对列的正常事务unsigned那样)。一般来说,没有任何约束可以做到这一点(至少我知道),但是,如果你打开严格模式(with STRICT_TRANS_TABLES)任何将负值插入无符号列的查询都会失败并出现错误(以及任何其他数据插入错误,例如无效enum值)。

您可以通过在插入命令之前运行以下命令来测试它:

SET @@SESSION.sql_mode = 'STRICT_TRANS_TABLES';

如果它适合您,您可以使用sql-mode="STRICT_TRANS_TABLES"或使用更新您的 MySQL 配置SET @@GLOBAL.sql_mode = 'STRICT_TRANS_TABLES';(我不确定该SET命令是否会影响全局 mysql 配置,因此更新实际配置文件可能会更好)。

于 2012-11-05T03:14:50.870 回答
5

从 MySQL 8.0.16 (MariaDB 10.2.1 ) 开始,强制执行CHECK约束。(在早期版本中,约束表达式在语法中被接受但被忽略)。

因此,您可以使用:

CREATE TABLE test (
    test_column INT CHECK (test_column > 0)
);

或者

CREATE TABLE test (
    test_column INT,
    CONSTRAINT test_column_positive CHECK (test_column > 0)
);
于 2019-07-23T15:22:06.617 回答
0

您应该使用 UNSIGNED INTEGER 数据类型。欲了解更多信息,请单击此处

于 2012-11-05T03:15:38.570 回答
0

解决这个问题的方法是明确告诉 MySQL 服务器创建一个无符号整数。

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 回答
0

仅用于unsigned仅允许正值。

CREATE TABLE hello 
(
    world int unsigned
);

取消注释该行,您将看到错误消息:数据截断:第 1 行列“世界”的值超出范围:

于 2012-11-05T03:16:10.307 回答