Ich kann das Problem nicht reproduzieren.
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
UPDATE
Nachdem Sie Ihre Frage aktualisiert:
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)
Beachten Sie den Unterschied in Sortierungs.
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
UPDATE 2
Wenn die Abfrage die temporäre Tabelle zu erstellen versucht, verursacht der Unterabfrage der Standardwert von ts
Spalte definiert ist als '0000-00-00 00:00:00'
und der Server muss die NO_ZERO_DATE
in der Variablen SQL_MODE
konfiguriert werden Wert, der den Fehler verursacht.
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)
NO_ZERO_DATE
von SQL_MODE
entfernen.
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)
Sie können das Problem vermeiden, indem Sie die Unterabfrage entfernen.
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)
Arbeiten für mich ... –
für mich zu http://rextester.com/RLDT26402 –
weiß nicht, warum Sie 'TEMPORARY TABLE TMP_TEST' benötigen, weil Sie nur knapp sein Ziel verwenden. Aber du vermisst ein Semikolon da ';' –