2014-11-24 77 views
0

我在phpMyAdmin的MySQL中创建了表INVOICES。如何防止MySQL数值发生变化? (phpMyAdmin)

CREATE TABLE INVOICES(
INVOICENUMBER  NUMERIC(3) NOT NULL PRIMARY KEY, 
JOBID    NUMERIC(3) NOT NULL, 
CURRENTDATE   DATE, 
CHARGEDETAILS  VARCHAR(200), 
CHARGESUBTOTAL  NUMERIC(3,2) NOT NULL CHECK (CHARGESUBTOTAL >= 0), 
GRANDTOTAL   NUMERIC(3,2) NOT NULL CHECK (GRANDTOTAL >= 0), 
FINALWORKLOG  VARCHAR(200), 
TERMS    VARCHAR(200), 
INDEX (JOBID) 
); 

但是,在尝试向表中添加记录时遇到问题。第一个插入命令正确输入所有内容,但第二个命令将表中的数值(CHARGESUBTOTAL和GRANDTOTAL)转换为9.99。我不确定是什么原因造成的,所以任何人都可以帮助我?

INSERT INTO INVOICES VALUES (1,1,'2014-11-15','None as the job was cancelled.',0.00,0.00,'The job was cancelled.','None.'); 
INSERT INTO INVOICES VALUES (2,2,'2014-11-15','£31.80 for total work.',31.80,35.00,'Employee took care of all the expected duties.','Payment should be undertaken within 7 days of receipt.'); 

回答

2

因为值(即31.80)超出范围和最大值被存储在哪个是9.99列。

NUMERIC(3,2) 

可以有3位数 - 前一个和后两个逗号。

1

问题是列数据类型:NUMERIC(3,2)

在这里看到:http://dev.mysql.com/doc/refman/5.0/en/fixed-point-types.html

3装置3个显著数字将被存储(即0-999或0-99.9或0-9.99)。 2是小数点后的数字位数,因此3,2表示0-9.99,但4,1表示0-99.99,依此类推。

根据您的业务需求更改为NUMERIC(10,2)或类似的东西。

1

更改此:

CHARGESUBTOTAL  NUMERIC(3,2) NOT NULL CHECK (CHARGESUBTOTAL >= 0), 
GRANDTOTAL   NUMERIC(3,2) NOT NULL CHECK (GRANDTOTAL >= 0), 

要:

CHARGESUBTOTAL  NUMERIC(4,2) NOT NULL CHECK (CHARGESUBTOTAL >= 0), 
GRANDTOTAL   NUMERIC(4,2) NOT NULL CHECK (GRANDTOTAL >= 0), 

Documentation

1

问题在于NUMERIC(3,2)。使用NUMERIC(5,2)改变这一点,让事情顺利进行。

说明:

在DECIMAL列声明,精度和标度可以是(并且通常是)指定;例如:

salary DECIMAL(5,2) 在此示例中,5是精度,2是规模。精度表示为值存储的有效数字的数量,标度表示可以存储在小数点后面的数字的数量。

标准SQL要求DECIMAL(5,2)能够存储具有五位数和两位小数的任何值,因此可存储在工资列中的值范围为-999.99至999.99。

参考链接:http://dev.mysql.com/doc/refman/5.5/en/fixed-point-types.html