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<>小提琴在这里