J'ai une fonction stockée où j'utilise des tables temporaires. Pour des raisons de performances, j'ai besoin d'un index dans cette table. Malheureusement, je ne peux pas utiliser ALTER TABLE
parce que cela provoque une validation implicite.
Par conséquent, je cherche la syntaxe pour ajouter le INDEX
à tempid
lors de la création. Quelqu'un peut-il être utile?
CREATE TEMPORARY TABLE tmpLivecheck
(
tmpid INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY
)
SELECT *
FROM tblLivecheck_copy
WHERE tblLivecheck_copy.devId = did;
J'ai trouvé la réponse moi-même. Mon problème était que j'utilise deux tables temporaires pour une jointure et crée la seconde sur la première. Mais l'Index n'a pas été copié lors de la création ...
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;
... résolu mon problème.
Salutations...
J'ai longuement lutté avec la syntaxe appropriée pour CREATE TEMPORARY TABLE SELECT. Après avoir compris quelques points, je voulais partager les réponses avec le reste de la communauté.
Des informations de base sur la déclaration sont disponibles aux liens MySQL suivants:
CREATE TABLE SELECT et CREATE TABLE .
Parfois, il peut être difficile d’interpréter les spécifications. Étant donné que la plupart des gens apprennent mieux à partir d'exemples, je partagerai comment j'ai créé une déclaration de travail et comment vous pouvez la modifier pour qu'elle fonctionne à votre place.
Ajouter plusieurs index
Cette instruction montre comment ajouter plusieurs index (notez que les noms d'index - en minuscule - sont facultatifs):
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
Ajouter une nouvelle clé primaire :
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
Créer des colonnes supplémentaires
Vous pouvez créer une nouvelle table avec plus de colonnes que celles spécifiées dans l'instruction SELECT. Spécifiez la colonne supplémentaire dans la définition de la table. Les colonnes spécifiées dans la définition de table et non trouvées dans select seront les premières colonnes de la nouvelle table, suivies des colonnes insérées par l'instruction 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
Redéfinition des types de données pour les colonnes de SELECT
Vous pouvez redéfinir le type de données d'une colonne en cours de sélection. Dans l'exemple ci-dessous, la balise column est un MEDIUMINT dans core.my_big_table et je le redéfinis en un BIGINT dans 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
Définitions de champ avancées lors de la création
Toutes les définitions de colonne habituelles sont disponibles comme lorsque vous créez une table normale. Exemple:
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
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)]
[table_options]
select_statement
Exemple :
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;