Dość długo zmagałem się z właściwą składnią dla CREATE TEMPORARY TABLE SELECT. Po ustaleniu kilku rzeczy, chciałem podzielić się odpowiedziami z resztą społeczności.
Podstawowe informacje o wyciągu są dostępne pod następującymi linkami MySQL:
STWÓRZ WYBÓR TABELI i UTWÓRZ TABELĘ .
Czasami interpretacja specyfikacji może być zniechęcająca. Ponieważ większość ludzi uczy się najlepiej na przykładach, podzielę się tym, jak stworzyłem oświadczenie robocze i jak możesz je zmodyfikować, aby działało dla Ciebie.
Dodaj wiele indeksów
Ta instrukcja pokazuje, jak dodać wiele indeksów (zwróć uwagę, że nazwy indeksów - małymi literami - są opcjonalne):
CREATE TEMPORARY TABLE core.my_tmp_table
(INDEX my_index_name (tag, time), UNIQUE my_unique_index_name (order_number))
SELECT * FROM core.my_big_table
WHERE my_val = 1
Dodaj nowy klucz podstawowy :
CREATE TEMPORARY TABLE core.my_tmp_table
(PRIMARY KEY my_pkey (order_number),
INDEX cmpd_key (user_id, time))
SELECT * FROM core.my_big_table
Utwórz dodatkowe kolumny
Możesz utworzyć nową tabelę z większą liczbą kolumn niż określono w instrukcji SELECT. Określ dodatkową kolumnę w definicji tabeli. Kolumny określone w definicji tabeli i nie znalezione w select będą pierwszymi kolumnami w nowej tabeli, po których nastąpią kolumny wstawione przez instrukcję SELECT.
CREATE TEMPORARY TABLE core.my_tmp_table
(my_new_id BIGINT NOT NULL AUTO_INCREMENT,
PRIMARY KEY my_pkey (my_new_id), INDEX my_unique_index_name (invoice_number))
SELECT * FROM core.my_big_table
Przedefiniowanie typów danych dla kolumn z SELECT
Możesz ponownie zdefiniować typ danych wybranej kolumny. W poniższym przykładzie tag kolumny to MEDIUMINT w core.my_big_table i przedefiniowuję go na BIGINT w core.my_tmp_table.
CREATE TEMPORARY TABLE core.my_tmp_table
(tag BIGINT,
my_time DATETIME,
INDEX my_unique_index_name (tag) )
SELECT * FROM core.my_big_table
Zaawansowane definicje pól podczas tworzenia
Wszystkie typowe definicje kolumn są dostępne tak, jak podczas tworzenia zwykłej tabeli. Przykład:
CREATE TEMPORARY TABLE core.my_tmp_table
(id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
value BIGINT UNSIGNED NOT NULL DEFAULT 0 UNIQUE,
location VARCHAR(20) DEFAULT "NEEDS TO BE SET",
country CHAR(2) DEFAULT "XX" COMMENT "Two-letter country code",
INDEX my_index_name (location))
ENGINE=MyISAM
SELECT * FROM core.my_big_table
Sam znalazłem odpowiedź. Mój problem polegał na tym, że używam dwóch tabel tymczasowych do łączenia i tworzę drugą z pierwszej. Ale indeks nie został skopiowany podczas tworzenia ...
CREATE TEMPORARY TABLE tmpLivecheck (tmpid INTEGER NOT NULL AUTO_INCREMENT, PRIMARY KEY(tmpid), INDEX(tmpid)) SELECT * FROM tblLivecheck_copy WHERE tblLivecheck_copy.devId = did; CREATE TEMPORARY TABLE tmpLiveCheck2 (tmpid INTEGER NOT NULL, PRIMARY KEY(tmpid), INDEX(tmpid)) SELECT * FROM tmpLivecheck;
... rozwiązał mój problem.
Pozdrowienia...
źródło
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_options] select_statement
Przykład:
CREATE TEMPORARY TABLE IF NOT EXISTS mytable (id int(11) NOT NULL, PRIMARY KEY (id)) ENGINE=MyISAM; INSERT IGNORE INTO mytable SELECT id FROM table WHERE xyz;
źródło
PRIMARY KEY
jest zawsze indeksowany.