sql >> Database >  >> RDS >> Mysql

Maak een tijdelijke tabel in MySQL met een index van een select

Ik worstelde een tijdje met de juiste syntaxis voor CREATE TIJDELIJKE TABLE SELECT. Nadat ik een paar dingen had bedacht, wilde ik de antwoorden delen met de rest van de gemeenschap.

Basisinformatie over de verklaring is beschikbaar via de volgende MySQL-links:

MAAK TAFELSELECTIE en TABEL MAKEN .

Soms kan het ontmoedigend zijn om de specificatie te interpreteren. Aangezien de meeste mensen het beste leren van voorbeelden, zal ik vertellen hoe ik een werkverklaring heb gemaakt en hoe u deze kunt aanpassen zodat deze voor u werkt.

  1. Meerdere indexen toevoegen

    Deze instructie laat zien hoe u meerdere indexen kunt toevoegen (merk op dat indexnamen - in kleine letters - optioneel zijn):

    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
    
  2. Een nieuwe primaire sleutel toevoegen :

    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
    
  3. Maak extra kolommen

    U kunt een nieuwe tabel maken met meer kolommen dan zijn opgegeven in de SELECT-instructie. Geef de extra kolom op in de tabeldefinitie. Kolommen die zijn opgegeven in de tabeldefinitie en niet worden gevonden in select, zijn de eerste kolommen in de nieuwe tabel, gevolgd door de kolommen die zijn ingevoegd door de SELECT-instructie.

    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
    
  4. Gegevenstypen voor de kolommen uit SELECT opnieuw definiëren

    U kunt het gegevenstype van een kolom die wordt geselecteerd opnieuw definiëren. In het onderstaande voorbeeld is de kolomtag een MEDIUMINT in core.my_big_table en ik herdefinieer deze naar een BIGINT in 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
    
  5. Geavanceerde velddefinities tijdens het maken

    Alle gebruikelijke kolomdefinities zijn beschikbaar zoals wanneer u een normale tabel maakt. Voorbeeld:

    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
    


  1. set-namen vs mysqli_set_charset - zijn ze, behalve dat ze van invloed zijn op mysqli_escape_string, identiek?

  2. Rails 4 LIKE-query - ActiveRecord voegt aanhalingstekens toe

  3. Tel het aantal voorkomens van een string in een VARCHAR-veld?

  4. Hoe snel 3 willekeurige records SELECTEREN uit een 30k MySQL-tabel met een waar-filter door een enkele query?