2016-11-05 16 views
-2

finde ich nicht, warum dies in MySQL nicht gültig 5.7 (getestet mit 5.7.16)Ungültige Standardwert für Zeitstempel Spalt

CREATE TABLE TEST_TABLE (ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP); 
INSERT INTO TEST_TABLE() VALUES(); 
DROP TEMPORARY TABLE IF EXISTS TMP_TEST; 
CREATE TEMPORARY TABLE TMP_TEST SELECT * FROM (SELECT ts FROM TEST_TABLE) wrap; 

Ich erhalte diesen: Fehlercode: 1067. Ungültige Standardwert für 'ts'

Fehle ich etwas oder ist es ein Mysql-Bug?

+0

Arbeiten für mich ... –

+0

für mich zu http://rextester.com/RLDT26402 –

+0

weiß nicht, warum Sie 'TEMPORARY TABLE TMP_TEST' benötigen, weil Sie nur knapp sein Ziel verwenden. Aber du vermisst ein Semikolon da ';' –

Antwort

0

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) 
+0

danke, aber das ist nicht der Code, den ich gepostet habe ... was du machst ist etwas anderes. Der Fehler, den Sie erhalten haben (1113), wird erwartet, da Sie keine Spalten für Ihre temporäre Tabelle deklarieren. Um das Problem zu reproduzieren, müssen Sie Anweisungen in der gleichen Reihenfolge und Zeilen 4 und 5 zusammen ausführen (es ist eine einzige Anweisung) – romric

+0

Nur meine Frage bearbeitet, um Verwirrung zu vermeiden. Problem tritt bei letzter Anweisung auf. – romric

+0

@romric: Aktualisierte Antwort. – wchiquito