MySQL kreiranje tabele s SELECT stavkom
Vsi poznamo standardni SQL stavek, ki nam kreira tabelo z določenimi polji, indexi, auto_increment poljem in tako naprej. Obstajajo pa tudi drugi način za kreiranje tabel in sicer s SELECT stavkom.
Primer standardnega SQL CREATE stavka:
-
CREATE TABLE `example` (
-
`id` BIGINT( 20 ) UNSIGNED NOT NULL AUTO_INCREMENT ,
-
`fid` BIGINT( 20 ) UNSIGNED NOT NULL ,
-
`status` TINYINT( 1 ) UNSIGNED NOT NULL DEFAULT '0',
-
PRIMARY KEY ( `id` ) ,
-
INDEX ( `fid` )
-
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_general_ci
Kot že rečeno pa obstaja tudi možnost kreiranje tabele z SELECT stavkom. Kako deluje? Izvedemo SELECT stavek z določene tabele ter pred SELECT stavkom dodamo CREATE TABLE `ime tabele`. Nato CREATE stavek kreira tabelo na podlagi rezultatov, ki jih vrne SELECT. Kreira natako toliko število stolpcev (enakega tipa kot je struktura rezultata - SELECT) ter vrstic.
Preprost primer:
-
DROP TABLE IF EXISTS `example`;
-
CREATE TABLE `example` SELECT CONCAT_WS(' ', name, surname) AS name, email FROM `members`
Sledeči stavek kreira tabelo z dvema stolpcema, kjer združimo name ter surname v en stolpec. Struktura kreirane tabele:
-
CREATE TABLE `example` (
-
`name` VARCHAR(511) DEFAULT NULL,
-
`email` VARCHAR(255) DEFAULT NULL
-
) ENGINE=INNODB DEFAULT CHARSET=utf8
Kot vidite se struktura tabele prilagodi glede ne strukturo rezultata (varchar (xyz)). Kaj pa če želimo za vsako vrstico določiti zaporedni unique ID? Uporabimo @spremenljivko:
-
SELECT @row_id := 0;
-
CREATE TABLE `example` SELECT @row_id := @row_id + 1 As id, CONCAT_WS(' ', name, surname) AS name, email FROM `members`
Za dodatek pa lahko še dodamo indexe, ko je tabela že kreirana:
-
ALTER TABLE `example` ADD PRIMARY KEY ( `id` );
-
ALTER TABLE `example` CHANGE `id` `id` BIGINT( 20 ) UNSIGNED NULL AUTO_INCREMENT;
Dodatne informacije:
Ste tudi vi že kdaj kreirali tabelo s SELECT stavkom? Uporabljate/poznate tudi kakšne druge podobne načine?
Podobni članki:
- MySQL dupliciranje podatkov z INSERT INTO SELECT stavkom
- MySQL date BETWEEN – DATE FORMAT
- Preprosta skripta – kreiranje Excel datoteke iz PHP tabele/array
- MySQL – date funkcije – current date, now, add date, sub date, interval
- Konverzija CP1250, ISO-8859-1 baze v UTF-8 – šumniki UTF-8 – cp1250 to utf8
- MySQL iskanje LIKE vs FULL-TEXT
- Pretvorba PHP MySQL aplikacije v PHP MS SQL aplikacijo (apache, php, mdb2, mysql => iis, php, mdb2, mssql)
- Kako preveriti ali že obstaja določena MySQL tabela
- UTF-8 tabele, vendar latin1 podatki ter povezava
- Operacije nad seznami – Javascript DOM – HTML select – HTML option



August 10th, 2008 ob 12:49 pm
Zanimivo. Mogoče še en konkreten primer aplikacije, kjer bi bilo tole uporabno?
August 10th, 2008 ob 2:31 pm
če dobro pomislim, sem tabele kreiral z queryji samo na enem projektu do zdaj, sicer pa to vedno počne phpmyadmin namesto mene.
Kreiranje z selectom iz druge tabele, je pa res še za kanček bolj specifičen feature in si je kar težko zamisliti nek case study, kot je ugotovil že komentator pred mano.
August 10th, 2008 ob 2:32 pm
P.S. če človek ne vpiše emaila ob komentarju, dobi Internal server error. To je pa kar resen error.
August 10th, 2008 ob 5:08 pm
@ace bom pogledal, hvala za poročilo.
Uporaben primer? Naprimer ko imaš neko tabelo z preveč podatki, ki opočasnujejo zadevo. Zato kreiraš tabelo (ki pa mora biti permanentna, ne kot view ali temp table), ki vsebuje strukturo, ki jo nujno potrebuješ in s tem pohitriš celoten proces. To recimo pride v poštev za RES veliko vrstic, kjer se vsaka minimalna stvar pozna:) Ja, najbrš je tut kakšen drug način zato ... ampak tale CREATE from select je pač ena izmed teh.
March 2nd, 2009 ob 7:01 pm
[...] Kreiranje tabele oz. strukture tabele s pomočjo SELECT stavka [...]