【问题标题】:Create mysql table limit integer to positive values创建mysql表限制整数为正值
【发布时间】:2013-12-13 09:32:40
【问题描述】:

我尝试创建一个具有 INTEGER 属性的表,该属性应限制为正数。我知道有一个 UNSIGNED 选项,但这样做是错误的。因为它允许添加 -10 作为值。它只会赚 10 分。

是否可以拒绝输入错误?我尝试使用 CHECK

DROP TABLE Produkt;
CREATE TABLE Produkt (
    Bezeichnung VARCHAR(237) PRIMARY KEY,
    ProduktNr INTEGER NOT NULL,
    Produktart VARCHAR(3) DEFAULT "XXX",
    CONSTRAINT onlyPositive CHECK(ProduktNr >= 0)
);

但我仍然可以添加 -10 作为值...我做错了什么?

【问题讨论】:

  • 检查这个答案以了解签名和未签名stackoverflow.com/questions/11515594/…
  • 无符号的不能保存负数。
  • unsigned 不能保存负数,但它不会阻止您添加负数...它们只会被转换为正数。

标签: mysql constraints


【解决方案1】:

1) 在严格的sql_mode 中,如果您将列定义为

ProduktNr INT UNSIGNED NOT NULL,

然后尝试插入负值会报错

错误 1264 (22003):第 1 行的“ProduktNr”列的值超出范围

这里是 SQLFiddle 演示。 取消注释插入语句并点击Build Schema

2) MySQL 仍然缺乏对CHECK 约束的支持。 The CHECK clause is parsed but ignored by all storage engines.

3) 附带说明:不要将 VARCHAR(237) 列用作 PRIMARY KEY,尤其是在您使用 InnoDB 引擎时(表中的所有二级索引也包括 PK 值)。

【讨论】:

  • 你到底为什么要实现一个特性 CHECK 然后忽略它? :D 感谢 sql_mode。这正是我想要的。
  • 我可以在双精度数据类型上使用无符号吗?
【解决方案2】:

我相信您可以只添加检查而不命名约束。这似乎对我有用:

CREATE TABLE Produkt (
    Bezeichnung VARCHAR(237),
    ProduktNr INTEGER NOT NULL,
    Produktart VARCHAR(3) DEFAULT "XXX",
    PRIMARY KEY (Bezeichnung),
    CHECK(ProduktNr >= 0)
);

我还移动了主键的声明。我不能 100% 确定您可以在声明字段的同时声明键,但我确实输入了我所知道的。

【讨论】:

  • 嗨。如果您想稍后更改,命名约束只是有助于跟踪。没有其他的。系统仍然不会阻止您添加负数。见sqlfiddle.com/#!2/d988a/1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-07
  • 1970-01-01
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
  • 2015-11-01
  • 2022-07-07
相关资源
最近更新 更多