使用检查约束将值插入 DECIMAL 列 >0.00 会产生 SQL 错误 1292 截断不正确的 DOUBLE 值



10.5.10-MariaDB

我有两个表,test1 和 test2。每个都有数据类型为 DECIMAL(5,2) 的单列"a_number"。test1 具有约束 CHECK('a_number'> 0.00)。test2 是已删除检查约束的 test1 的表副本。我在 test2 中添加了一个 1.23 的值。

当我运行以下查询时

INSERT INTO test1 (a_number)
SELECT a_number FROM test2;

我收到 SQL 错误 (1292) 截断了不正确的 DOUBLE 值"a_number">

| test1 | CREATE TABLE `test1` (
`a_number` decimal(5,2) NOT NULL,
CONSTRAINT `CC1` CHECK ('a_number' > 0.00)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
| test2 | CREATE TABLE `test2` (
`a_number` decimal(5,2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC |
SELECT * FROM test2;
+----------+
| a_number |
+----------+
|     1.23 |
+----------+

互联网搜索表明,由于比较不同的数据类型而发生错误。我尝试在 CHECK 中的文字中添加 CAST 以从字符串转换为十进制,但这没有效果。只是添加单引号,因为一些帖子似乎表明也不起作用(错误消失了,但约束不起作用,表明它现在将检查文字视为字符串)。

这是一个棘手的问题

您在检查约束中使用了单引号,因此 Maradb 将文本"a_namber"与数字进行比较,这会导致错误消息

请仔细阅读以下线程 何时在 MySQL 中使用单引号、双引号和反引号

CREATE TABLE `test1` (
`a_number` decimal(5,2) UNSIgNED NOT NULL,
CONSTRAINT `CC1` CHECK (`a_number` > 0.00)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE `test2` (
`a_number` decimal(5,2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC
INSERT INTO test2 VALUES (1.1)
INSERT INTO test1 (a_number)
SELECT a_number FROM test2
SELECT * FROM test1
|
a_number | |-------: | |    1.10 |

db<>小提琴在这里

最新更新