-
2021-12-08 14:13:27
在表中,我想让某一字段的值永远都是≥0的
比如商品库存始终要≥0,在修改库存时,如果 原库存-销售数量<0,此时应不做修改
通过constraint增加约束,如下所示:
alter table specification add constraint ck_stock check(stock>=0)
其中,specification是我的表名,换成自己的表名字就行
ck_stock:为这一约束起的名字,自己定义即可
stock>=0:stock是我要保证≥0的那个字段名
更多相关内容 -
想要将MySQL字段的值限制为特定范围(十进制值)
2021-07-19 19:10:48解决方案 You can simulate a check constraint in MySQL using triggers. For example, if you want to force all values larger than 1.00 to be stored as 1.00, you could do so with 2 triggers like this: ...I want to restrict the value of a field in a row of a table to a specific range. Is it possible to restrict my relationship_level field to [0.00 to 1.00]?
At the moment I am using DECIMAL(2,2), it wouldn't allow DECIMAL(1,2) as M must be >= D. I assume a data type of DECIMAL(2,2) will actually allow values from 00.00 up to 99.99?
CREATE TABLE relationships (
from_user_id MEDIUMINT UNSIGNED NOT NULL,
to_user_id MEDIUMINT UNSIGNED NOT NULL,
relationship_level DECIMAL(2,2) UNSIGNED NOT NULL,
PRIMARY KEY (from_user_id, to_user_id),
FOREIGN KEY (from_user_id) REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE NO ACTION,
FOREIGN KEY (to_user_id) REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE NO ACTION,
INDEX relationship_from_to (to_user_id, from_user_id, relationship_level)
) ENGINE = INNODB;
Is there a better way to do this, can anyone foresee any limitations?
Many thanks!
解决方案
You can simulate a check constraint in MySQL using triggers.
For example, if you want to force all values larger than 1.00 to be stored as 1.00, you could do so with 2 triggers like this:
DELIMITER $$
DROP TRIGGER IF EXISTS tr_b_ins_relationships $$
CREATE TRIGGER tr_b_ins_relationships BEFORE INSERT ON relationships FOR EACH ROW BEGIN
IF new.relationship_level > 1
THEN
SET new.relationship_level = 1;
END IF;
END $$
DELIMITER ;
DELIMITER $$
DROP TRIGGER IF EXISTS tr_b_upd_relationships $$
CREATE TRIGGER tr_b_upd_relationships BEFORE UPDATE ON relationships FOR EACH ROW BEGIN
IF new.relationship_level > 1
THEN
SET new.relationship_level = 1;
END IF;
END $$
DELIMITER ;
-
MySQL中各种字段的取值范围(转)
2021-02-03 15:19:17MySQL中各种字段的取值范围(转)[@more@]TINYINT-128 - 127TINYINT UNSIGNED0 - 255SMALLINT-32768 - 32767SMALLINT UNSIGNED0 - 65535MEDIUMINT-8388608 - 8388607MEDIUMINT UNSIGNED0 - 16777215INT 或 INTEGER-...MySQL中各种字段的取值范围(转)[@more@]TINYINT
-128 - 127
TINYINT UNSIGNED
0 - 255
SMALLINT
-32768 - 32767
SMALLINT UNSIGNED
0 - 65535
MEDIUMINT
-8388608 - 8388607
MEDIUMINT UNSIGNED
0 - 16777215
INT 或 INTEGER
-2147483648 - 2147483647
INT UNSIGNED 或 INTEGER UNSIGNED
0 - 4294967295
BIGINT
-9223372036854775808 - 9223372036854775807
BIGINT UNSIGNED
0 - 18446744073709551615
FLOAT
-3.402823466E+38 - -1.175494351E-38
0
1.175494351E-38 - 3.402823466E+38
DOUBLE 或 DOUBLE PRECISION 或 REAL
-1.7976931348623157E+308 - -2.2250738585072014E-308
0
2.2250738585072014E-308 - 1.7976931348623157E+308
DECIMAL[(M,[D])] 或 NUMERIC(M,D)
由M(整个数字的长度,包括小数点,小数点左边的位数,小数点右边的位数,但不包括负号)和
D(小数点右边的位数)来决定,M缺省为10,D缺省为0
DATE
1000-01-01 - 9999-12-31
DATETIME
1000-01-01 00:00:00 - 9999-12-31 23:59:59
TIMESTAMP
1970-01-01 00:00:00 - 2037年的某天(具体是哪天我也不知道,呵呵)
TIME
-838:59:59' to 838:59:59
YEAR[(2|4)]
缺省为4位格式,4位格式取值范围为1901 - 2155,0000,2位格式取值范围为70-69(1970-2069)
CHAR(M) [BINARY] 或 NCHAR(M) [BINARY]
M的范围为1 - 255,如果没有BINARY项,则不分大小写,NCHAR表示使用缺省的字符集.在数据库
中以空格补足,但在取出来时末尾的空格将自动去掉.
[NATIONAL] VARCHAR(M) [BINARY]
M的范围为1 - 255.在数据库中末尾的空格将自动去掉.
TINYBLOB 或 TINYTEXT
255(2^8-1)个字符
BLOB 或 TEXT
65535(2^16-1)个字符
MEDIUMBLOB 或 MEDIUMTEXT
16777215 (2^24-1)个字符
LONGBLOB 或 LONGTEXT
4294967295 (2^32-1)个字符
ENUM('value1','value2',...)
可以总共有65535个不同的值
SET('value1','value2',...)
最多有64个成员
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10617542/viewspace-947625/,如需转载,请注明出处,否则将追究法律责任。
-
MySql中字段类型与长度和取值范围解析
2021-01-18 19:39:06MySQL中的数据类型大体分为三大类,数值类型,时间日期类型以及字符串类型。下面将对这三种类型进行详细的介绍。一、数值类型MySQL 支持所有标准SQL 中的数值类型,其中包括严格数值类型(INTEGER、SMALLINT、DECIMAL...MySQL中的数据类型大体分为三大类,数值类型,时间日期类型以及字符串类型。下面将对这三种类型进行详细的介绍。
一、数值类型
MySQL 支持所有标准SQL 中的数值类型,其中包括严格数值类型(INTEGER、SMALLINT、DECIMAL 和NUMERIC),以及近似数值数据类型(FLOAT、REAL 和DOUBLE PRECISION),并在标准SQL的基础上扩展增加了 TINYINT、MEDIUMINT 和BIGINT 这3 种长度不同的整型和存放位数据的BIT类型。在日常建表定义当中,整型中最常用的依旧是int类型的数据,浮点型中则视情况而定。每种数据类型表示的范围如下表所示:
mediumint无符号最大为:16777215
注:我曾经在电信行业和银行业参与过IT项目的开发,在使用他们提供的数据的时候总会发现数据库中有小数点后数字时大都用的Decimal这种数据类型,而不是采用开发中常用的而且最大取值范围一样的Double类型。Double和Decimal都属于浮点型,但是Decimal在精度上面来说,它的精度是Double的两倍,Float的四倍,在银行或者通信这些对数据要求十分精确的行业,Decimal是优于Double的更好的选择。但是需要注意的事,Decimal也是浮点类型的数据,只不过相对来说精度更高,在实际使用中如果小数点后位数过多一样会存在精度损失的问题。在《阿里巴巴Java编程规范》,明确提出使用Decimal取代double和float
为整型指定宽度,如INT(11),对于存储来说INT(1)和INT(20)是相同的,它不会限制值的合法范围,只是规定了MySQL与客户端的交互应该显示多少位而已,比如你向INT(1)中插入了123456值,数据库中其实已经存入了123456,只是对于客户端查出来是1而已。
二、时间日期类型
MySQL中提供了五种类型的时间类型,分别为DATE,DATETIME,TIMESTAMP,TIME和YEAR。下表是日期类型的详细区间。
如果要用来表示年月日,通常用DATE 来表示。
如果要用来表示年月日时分秒,通常用DATETIME 表示。
如果只用来表示时分秒,通常用TIME 来表示。
如果需要经常插入或者更新日期为当前系统时间,则通常使用TIMESTAMP 来表示。
TIMESTAMP 值返回后显示为“YYYY-MM-DD HH:MM:SS”格式的字符串,显示宽度固定为19 个字符。如果想要获得数字值,应在TIMESTAMP 列添加+0。如果只是表示年份,可以用YEAR 来表示,它比DATE 占用更少的空间。YEAR 有2 位或4 位格式的年。默认是4 位格式。在4 位格式中,允许的值是1901~2155 和0000。在2 位格式中,允许的值是70~69,表示从1970~2069 年。MySQL 以YYYY 格式显示YEAR值。
三、字符串类型
MySQL 中提供了多种对字符数据的存储类型,不同的版本可能有所差异。以5.0 版本为例,MySQL 包括了CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM 和SET 等多种数据类型。其中常用的为VARCHAR,TEXT等。其中CHAR和VARCHAR存在以下区别
1.CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串“abc",对于CHAR (10),表示你存储的字符将占10个字节(包括7个空字符),而同样的
VARCHAR2 (10)则只占用3个字节的长度,10只是最大值,当你存储的字符小于10时,按实际长度存储。
2.CHAR的效率比VARCHAR2的效率稍高。
3.目前VARCHAR是VARCHAR2的同义词。工业标准的VARCHAR类型可以存储空字符串,但是oracle不这样做,尽管它保留以后这样做的权利。Oracle自己开发了一个数据类型VARCHAR2,
这个类型不是一个标准的VARCHAR,它将在数据库中varchar列可以存储空字符串的特性改为存储NULL值。如果你想有向后兼容的能力,Oracle建议使用VARCHAR2而不是VARCHAR。
下表列出了MySQL中所有的字符类型。
在实际的建表定义字段类型时,字符串通常会考虑使用VARCHAR,当字段数据有明确的精度和长度时使用CHAR更加高效。在有长文本输入时选择TEXT输入。其它的在平常开发中很少用到了。
-
mysql的字段类型范围必须重视起来
2021-02-03 05:55:39在MySQL数据类型中,例如INT,FLOAT,DOUBLE,CHAR,DECIMAL等,它们都有各自的作用,下面我们就主要来介绍一下MySQL数据类型中的DECIMAL类型的作用和用法。一般赋予浮点列的值被四舍五入到这个列所指定的十进制数。如果... -
MySQL学习笔记4:完整性约束限制字段
2020-12-15 16:53:48完整性约束是对字段进行限制,从而符合该字段达到我们期望的效果比如字段含有默认值,不能是NULL等 直观点说:如果插入的数据不满足限制要求,数据库管理系统就拒绝执行操作 设置表的主键 主键能够标识表中每条信息... -
Mysql字段长度限制你真的了解吗?
2021-01-18 20:24:00一、行容纳的字段长度众所周知,记录是以行的形式进行保存的,Mysql5.1以后,行的保存格式默认为Compact格式。行记录Compact格式为:变长字段NULL标志位记录头信息列1数据列2数据列3数据...第一个变长字段是记录这行... -
SQL Server限制输入值的取值范围的是什么
2021-01-18 20:51:27展开全部SQL Server限制输入值的取值范围的是用户自己定义32313133353236313431303231363533e4b893e5b19e31333433623234的。CHECK 约束用于限制列中的值的范围。如果对单个列定义 CHECK 约束,那么该列只允许特定的... -
mysql 如何限制字段性别为男女
2021-01-19 02:44:03如果确定某个字段的数据只有那么几个值:如性别,男、女、保密,系统就可以在设定字段的时候规定当前字段只能存放固定的几个值:使用枚举基本语法:enum(数据值1,数据值2…)系统提供了1到2个字节来存储枚举数据:... -
mysql如何设置字段值固定值
2022-04-27 16:51:49如题,在mysql中,怎么样设置表中的某一个字段值为固定值?不可更改的那种。 -
MySQL 建表字段长度的限制问题
2020-12-22 07:12:50在MySQL建表时,遇到一个奇怪的现象:root@localhost : test 10:30:54>CREATE TABLEtb_test (-> recordid varchar(32)NOT NULL,-> areaShowvarchar(10000)DEFAULT NULL,-> areaShow1varchar(10000)... -
想要将MySQL字段的值限制为特定范围(十进制值)
2021-03-14 12:40:34我想将表格行中的字段值限制为特定范围.是否可以将我的relationship_level字段限制为[0.00到1.00]?目前我正在使用DECIMAL(2,2),它不允许DECIMAL(1,2),因为M必须是> = D.我假设数据类型DECIMAL(2,2)实际上将允许... -
将MySQL数据类型的值限制为特定范围(最好不是ENUM)
2021-01-19 19:48:18我想将可以存储在字段中的数据类型值限制为整数值的特定范围:[0,10]。在PHP脚本中的用户输入上,我验证并清除了数据以确保其在0到10的范围内。但是,是否有办法通过某种数据类型或约束来确保在表决表本身中保持这种... -
MySQL字段长度、取值范围、存储开销(5.6/5.7/8.x的主要类型,区分显示宽度/有无符号/定点浮点、不同时间...
2019-05-29 18:18:10介绍MySQL所有字段的长度定义、计算方式、存储开销,包括char、varchar、int、bigint、decimal、double、boolean、date/timestamp等。 如果你疑惑于int(4)是几位,varchar应该是63还是64、double还是decimal,那么... -
MySQL 建表字段长度的限制
2020-12-22 07:14:04先上测试说明:在MySQL建表时,遇到一个奇怪的现象:root@localhost : test 10:30:54>CREATE TABLE tb_test (-> recordid varchar(32) NOT NULL,-> areaShow varchar(10000) DEFAULT NULL,-> ar... -
比较详细的MySQL字段类型说明
2020-12-15 15:00:26由MySQL支持的列类型列在下面。下列代码字母用于描述中: M 指出最大的显示尺寸。最大的合法的显示尺寸是 255 。...有符号的范围是-128到127,无符号的范围是0到255。 SMALLINT[(M)] [UNSIGNED] [ZEROFILL] 一个小整数 -
mysql增加字段 mysql数据库更新字段语句
2021-01-18 19:12:29myesl是一个关系型数据库管理系统,也是目前最流行的管理系统之一,...mysql增加字段——mysql数据库更新字段语句一、UPDATE:UPDATE的功能是更新表中的数据。这的语法和INSERT的第二种用法相似。必须提供表名以及... -
mysql 字段类型说明
2020-12-17 17:31:08MySQL支持大量的列类型,它可以被分为3类:数字类型、日期和时间类型以及字符串(字符)类型。本节首先给出可用类型的一个概述,并且总结每个列类型的存储需求,然后提供每个类中的类型性质的更详细的描述。概述有意... -
mysql数据库字段类型详解
2021-01-26 07:16:13概述有意简化,更详细的说明应该考虑到有关特定列类型的附加信息,例如你能为其指定值的允许格式。由MySQL支持的列类型列在下面。下列代码字母用于描述中:M指出最大的显示尺寸。最大的合法的显示尺寸是 255... -
mysql 数据库字段类型大全
2022-06-02 17:21:571.十分小的数据,占用1个字节,有符号的范围是-128 - 127,无符号的范围是 从 0 到 255 的整型数据 2.java类型Integer1.较小的数据,占用2个字节 2.java类型Integer1.中等大小的数据,占用3个字节 2.java类型Integer1.... -
如何修改Mysql中group_concat的长度限制
2020-12-16 02:49:45用group_concat连接字段的时候是有长度限制的,并不是有多少连多少。但你可以设置一下。 使用group_concat_max_len系统变量,你可以设置允许的最大长度。 系统默认的分隔符是逗号 修改方式: SET [SESSION | ... -
MySQL字段展示
2022-02-10 10:43:40显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示。 当结合可选扩展属性ZEROFILL使用时, 默认补充的空格用零代替。例如,对于声明为INT(5) ZEROFILL的列,值4检索为00004。请注意... -
mysql:你可以用什么来确保表格里的字段只接受特定范围里的值?
2022-04-09 18:59:42你可以用什么来确保表格里的字段只接受特定范围里的值? Check限制,它在数据库表格里被定义,用来限制输入该列的值。 触发器也可以被用来限制数据库表格里的字段能够接受的值,但是这种办法要求触发器在表格里... -
MySQL中字段类型与合理的选择字段类型
2021-01-19 15:08:58许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 MySQL 允许我们指定数值字段中的值是否有正负之分( UNSIGNED )或者用零填补( ZEROFILL )。 MySQL 以一个 可选的显示 宽度指示... -
mysql字段类型
2021-01-19 05:47:08许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 MySQL 允许我们指定数值字段中的值是否有正负之分(UNSIGNED)或者用零填补(ZEROFILL)。INT在 MySQL 中支持的 5 个主要整数类型...