我们如何添加一个约束来强制列只有正值。
尝试了以下mysql语句,但它不起作用
create table test ( test_column integer CONSTRAINT blah > 0);
答案 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)
);