我无法重现该问题。
mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.7.16 |
+-----------+
1 row in set (0,00 sec)
mysql> CREATE TABLE TEST_TABLE (ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
Query OK, 0 rows affected (0,00 sec)
mysql> INSERT INTO TEST_TABLE() VALUES ();
Query OK, 1 row affected (0,00 sec)
mysql> SELECT * FROM (SELECT ts FROM TEST_TABLE) wrap;
+---------------------+
| ts |
+---------------------+
| 2016-11-04 00:00:01 |
+---------------------+
1 row in set (0,00 sec)
mysql> DROP TEMPORARY TABLE IF EXISTS TMP_TEST;
Query OK, 0 rows affected, 1 warning (0,00 sec)
mysql> CREATE TEMPORARY TABLE TMP_TEST;
ERROR 1113 (42000): A table must have at least 1 column
更新
更新问题后:
mysql> SELECT ts FROM TEST_TABLE;
Field 1: `ts`
Catalog: `def`
Database: `test`
Table: `TEST_TABLE`
Org_table: `TEST_TABLE`
Type: TIMESTAMP
Collation: binary (63)
Length: 19
Max_length: 19
Decimals: 0
Flags: NOT_NULL BINARY TIMESTAMP
+---------------------+
| ts |
+---------------------+
| 2016-11-04 00:00:01 |
+---------------------+
1 row in set (0,00 sec)
mysql> SELECT * FROM (SELECT ts FROM TEST_TABLE) wrap;
Field 1: `ts`
Catalog: `def`
Database: `test`
Table: `wrap`
Org_table: `*`
Type: TIMESTAMP
Collation: utf8_general_ci (33)
Length: 57
Max_length: 19
Decimals: 0
Flags: NOT_NULL BINARY TIMESTAMP
+---------------------+
| ts |
+---------------------+
| 2016-11-04 00:00:01 |
+---------------------+
1 row in set (0,00 sec)
注意排序规则的区别。
mysql> CREATE TEMPORARY TABLE TMP_TEST
-> SELECT * FROM (SELECT BINARY ts FROM TEST_TABLE) wrap;
Query OK, 1 row affected (0,00 sec)
Records: 1 Duplicates: 0 Warnings: 0
更新 2
当查询尝试创建临时表时,子查询导致ts列的默认值被定义为'0000-00-00 00:00:00'并且服务器必须在变量SQL_MODE中配置NO_ZERO_DATE值,这会导致错误。
mysql> SELECT FIND_IN_SET('NO_ZERO_DATE', @@SQL_MODE);
+-----------------------------------------+
| FIND_IN_SET('NO_ZERO_DATE', @@SQL_MODE) |
+-----------------------------------------+
| 4 |
+-----------------------------------------+
1 row in set (0,00 sec)
从SQL_MODE 中删除NO_ZERO_DATE。
mysql> SELECT FIND_IN_SET('NO_ZERO_DATE', @@SQL_MODE);
+-----------------------------------------+
| FIND_IN_SET('NO_ZERO_DATE', @@SQL_MODE) |
+-----------------------------------------+
| 0 |
+-----------------------------------------+
1 row in set (0,00 sec)
mysql> DROP TEMPORARY TABLE IF EXISTS TMP_TEST;
Query OK, 0 rows affected (0,00 sec)
mysql> CREATE TEMPORARY TABLE TMP_TEST
-> SELECT * FROM (SELECT ts FROM TEST_TABLE) wrap;
Query OK, 1 row affected (0,00 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE TMP_TEST\G
*************************** 1. row ***************************
Table: TMP_TEST
Create Table: CREATE TEMPORARY TABLE `TMP_TEST` (
`ts` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=InnoDB
1 row in set (0,00 sec)
您可以通过删除子查询来避免该问题。
mysql> SELECT FIND_IN_SET('NO_ZERO_DATE', @@SQL_MODE);
+-----------------------------------------+
| FIND_IN_SET('NO_ZERO_DATE', @@SQL_MODE) |
+-----------------------------------------+
| 4 |
+-----------------------------------------+
1 row in set (0,00 sec)
mysql> DROP TEMPORARY TABLE IF EXISTS TMP_TEST;
Query OK, 0 rows affected (0,00 sec)
mysql> CREATE TEMPORARY TABLE TMP_TEST
-> SELECT ts FROM TEST_TABLE;
Query OK, 1 row affected (0,00 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE TMP_TEST\G
*************************** 1. row ***************************
Table: TMP_TEST
Create Table: CREATE TEMPORARY TABLE `TMP_TEST` (
`ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB
1 row in set (0,00 sec)