- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想通过 MySQL 中的 SELECT 语句创建临时表。它涉及多个 JOIN,并且可以产生 NULL 值,我希望 MySQL 将其视为零。这听起来像是一个简单的问题(简单地默认为零),但 MySQL(5.6.12)无法引出默认值。
例如,采用以下两个表:
mysql> select * from TEST1;
+------+------+
| a | b |
+------+------+
| 1 | 2 |
| 4 | 25 |
+------+------+
2 rows in set (0.00 sec)
mysql> select * from TEST2;
+------+------+
| b | c |
+------+------+
| 2 | 100 |
| 3 | 100 |
+------+------+
2 rows in set (0.00 sec)
左连接给出:
mysql> select TEST1.*,c from TEST1 left join TEST2 on TEST1.b=TEST2.b;
+------+------+------+
| a | b | c |
+------+------+------+
| 1 | 2 | 100 |
| 4 | 25 | NULL |
+------+------+------+
2 rows in set (0.00 sec)
现在,如果我想将这些值保存在临时表中(将 NULL 更改为零),我将使用以下代码:
mysql> create temporary table TEST_JOIN (a int, b int, c int default 0 not null)
select TEST1.*,c from TEST1 left join TEST2 on TEST1.b=TEST2.b;
ERROR 1048 (23000): Column 'c' cannot be null
我做错了什么?最糟糕的是,在我进行系统范围的升级之前,这段代码曾经可以工作(我不记得我有哪个版本的 MySQL,但它肯定低于我当前的 5.6)。它曾经产生我期望的行为:如果它是 NULL,则使用默认值,而不是我现在遇到的令人沮丧的错误。
来自 5.6 的文档(自 4.1 以来未更改):
Inserting NULL into a column that has been declared NOT NULL. For multiple-row INSERT statements or INSERT INTO ... SELECT statements, the column is set to the implicit default value for the column data type. This is 0 for numeric types, the empty string ('') for string types, and the “zero” value for date and time types. INSERT INTO ... SELECT statements are handled the same way as multiple-row inserts because the server does not examine the result set from the SELECT to see whether it returns a single row. (For a single-row INSERT, no warning occurs when NULL is inserted into a NOT NULL column. Instead, the statement fails with an error.)
我当前的解决方法是将 NULL
值存储在时态表中,然后用零替换它们,但对于很多列来说这似乎相当麻烦(而且效率非常低)。有更好的方法吗?
顺便说一句,我不能简单地忽略查询中的某些列( as suggested for another question ),因为它是一个多行查询。
最佳答案
IFNULL(`my_column`,0);
这会将 NULL 设置为 0。其他值保持原样。
只需用 IFNULL 包装您的值/列名称,它就会将它们转换为您放入函数中的任何默认值。例如。 0. 或“欧洲燕子”,或任何你想要的。
然后您可以保持严格模式开启并仍然优雅地处理 NULL。
关于mysql - 如何在 MySQL 的时态表中插入默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18242113/
我是一名优秀的程序员,十分优秀!