2012-04-13 19 views
38

Voglio creare una nuova tabella con le proprietà di una vecchia tabella e senza duplicati. Voglio fare qualcosa di simile:CREATE TABLE LIKE A1 come A2

CREATE TABLE New_Users LIKE Old_Users, 
AS 
(SELECT * FROM Old_Users GROUP BY ID) ; 

ma quanto sopra non funziona. Per favore, qualcuno può modificarlo per funzionare?

+0

Si noti che l'uso di 'LIKE' renderà la nuova tabella con indici simili. – Nav

risposta

69

Il tentativo non è stato poi così male. Devi farlo con LIKE, sì.

Nel manual dice:

Usa desideri creare una tabella vuota basato sulla definizione di un'altra tavolo, comprese eventuali attributi di colonna e indici definiti nella tabella originale .

in modo da:

CREATE TABLE New_Users LIKE Old_Users; 

quindi si inserisce con

INSERT INTO New_Users SELECT * FROM Old_Users GROUP BY ID; 

Ma non si può fare in una dichiarazione.

+0

l'istruzione LIKE dovrebbe essere in parens: CREATE TABLE New_Users (LIKE Old_Users); – Marcao

+0

No, non è necessario. – fancyPants

+2

Hai ragione, non lo è. Scusate. – Marcao

1

Sulla base http://dev.mysql.com/doc/refman/5.0/en/create-table-select.html

Che dire:

Create Table New_Users Select * from Old_Users Where 1=2; 

e se questo non funziona, basta selezionare una riga e troncare dopo la creazione:

Create table New_Users select * from Old_Users Limit 1; 
Truncate Table New_Users; 

EDIT:

Ho notato il tuo commento qui sotto sulla necessità di indicizzare, ecc. Prova:

show create table old_users; 
#copy the output ddl statement into a text editor and change the table name to new_users 
#run the new query 
insert into new_users(id,name...) select id,name,... form old_users group by id; 

Che dovrebbe farlo. Sembra che tu stia facendo questo per sbarazzarti dei duplicati? In tal caso potresti voler inserire un indice univoco su id. se è una chiave primaria, dovrebbe essere già presente. È possibile:

#make primary key 
alter table new_users add primary key (id); 
#make unique 
create unique index idx_new_users_id_uniq on new_users (id); 
+0

@AshBurlaczenko, guarda il link che ho postato nella risposta, molti esempi nei documenti mysql senza specifiche di tabella. Posso vedere che ha bisogno di una specifica per la prima per funzionare in quanto non ci sono dati, ma il secondo esempio funzionerà a meno che i loro documenti non siano corretti. –

+0

Ho bisogno di una nuova tabella per avere le stesse strategie come il vecchio tavolo – Jigberto

+0

usa il secondo esempio e poi lancia "descrivi new_users;", che differenza c'è? –

1

Per MySQL, si può fare in questo modo:

CREATE TABLE New_Users SELECT * FROM Old_Users group by ID; 
+0

Ciao, sì, creando una nuova tabella, ma ho bisogno di questo nuovo tavolo per avere le stesse strategie come il vecchio tavolo. – Jigberto

+0

Dipendendo dalla documantazione mysql non è possibile conservare indici, PK, ecc. Ma è possibile definire indice come dice mysum documantation. http://dev.mysql.com/doc/refman/5.0/en/create-table-select.html CREATE TABLE ... SELECT non crea automaticamente alcun indice per te. Questo viene fatto intenzionalmente per rendere la dichiarazione più flessibile possibile. Se si desidera avere indici nella tabella creata, è necessario specificarli prima dell'istruzione SELECT: mysql> CREATE TABLE bar (UNICO (n)) SELECT n FROM pippo; –

0

CREATE TABLE new_table LIKE old_table;

o u possibile utilizzare questo

CREATE TABLE new_table come SELECT * FROM WHERE old_table 1 GROUP BY [colonna per rimuovere i duplicati da];

Problemi correlati