将正整数约束添加到MySQL中的整数列

时间:2012-11-05 03:12:09

标签: mysql

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

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

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

5 个答案:

答案 0 :(得分:16)

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

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

您可以详细了解数字数据类型(已签名和无符号)here

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

  

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

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

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

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

您可以在insert-commands之前运行以下命令来测试它:

SET @@SESSION.sql_mode = 'STRICT_TRANS_TABLES';

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

答案 1 :(得分:2)

只使用unsigned仅允许正值。

CREATE TABLE hello 
(
    world int unsigned
);

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

答案 2 :(得分:0)

您应该使用UNSIGNED INTEGER数据类型。有关详细信息,请click here

答案 3 :(得分: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`) 
); 

答案 4 :(得分:0)

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

因此您可以使用:

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

CREATE TABLE test (
    test_column INT,
    CONSTRAINT test_column_positive CHECK (test_column > 0)
);