我们如何添加一个强制列只有正值的约束。
尝试了以下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
);
您可以在此处阅读有关数字数据类型(有符号和无符号)的更多信息。
至于防止插入负值的实际约束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 配置,因此更新实际配置文件可能会更好)。
您应该使用 UNSIGNED INTEGER 数据类型。欲了解更多信息,请单击此处
解决这个问题的方法是明确告诉 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`)
);
仅用于unsigned
仅允许正值。
CREATE TABLE hello
(
world int unsigned
);
取消注释该行,您将看到错误消息:数据截断:第 1 行列“世界”的值超出范围: