2012-04-13 5 views
38

Ich möchte eine neue Tabelle mit Eigenschaften einer alten Tabelle und ohne Duplikate erstellen. Ich möchte so etwas tun:Tabelle wie A1 als A2 erstellen

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

Aber das obige funktioniert nicht. Kann jemand es ändern, um zu arbeiten?

+0

Beachten Sie, dass die Verwendung von 'LIKE' auch dazu führt, dass die neue Tabelle ähnliche Indizes aufweist. – Nav

Antwort

69

Ihr Versuch war nicht so schlimm. Sie müssen es mit LIKE tun, ja.

Im manual heißt es:

Gebrauch wie eine leere Tabelle basiert auf der Definition eines anderen Tabelle, einschließlich aller Spaltenattribute und Indizes in der Originaltabelle definiert zu erstellen.

So tun Sie:

CREATE TABLE New_Users LIKE Old_Users; 

Dann legen Sie mit

INSERT INTO New_Users SELECT * FROM Old_Users GROUP BY ID; 

Aber man kann es nicht in einer Anweisung tun.

+0

die LIKE-Anweisung sollte in Parens sein: CREATE TABLE New_Users (LIKE Old_Users); – Marcao

+0

Nein, das ist nicht nötig. – fancyPants

+2

Sie haben Recht, ist es nicht. Es tut uns leid. – Marcao

1

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

Was:

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

und wenn das nicht funktioniert, nur eine Zeile auswählen und nach der Erstellung gestutzt:

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

EDIT:

Ich habe Ihren Kommentar unten über die Notwendigkeit von Indizes etc. bemerkt. Versuchen Sie:

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; 

Das sollte es tun. Es scheint, dass Sie dies tun, um Duplikate loszuwerden? In diesem Fall möchten Sie vielleicht einen eindeutigen Index für die ID setzen. Wenn es ein Primärschlüssel ist, sollte dies bereits vorhanden sein. Sie können entweder:

#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, schau durch den Link, den ich in der Antwort geschrieben habe, viele Beispiele in den mysql-Dokumenten ohne Tabellenspezifikation. Ich kann sehen, dass es eine Spezifikation für die erste benötigt, um zu arbeiten, da es keine Daten gibt, aber das zweite Beispiel funktioniert, wenn ihre Dokumente nicht falsch sind. –

+0

Ich brauche eine neue Tabelle, um die gleiche Klasse zu haben wie die alte Tabelle – Jigberto

+0

benutze das zweite Beispiel und starte dann "describe new_users;", was ist anders? –

1

Für MySQL Sie es wie folgt tun:

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

Hallo, ja, es schafft neue Tabelle, aber ich brauche diese neue Tabelle, um gleiche Klassen wie alte Tabelle zu haben. – Jigberto

+0

Abhängig von mysql documantation können Sie keine Indizes, PKs usw. beibehalten. Sie können jedoch einen Index wie mysql documantation tells definieren. http://dev.mysql.com/doc/refman/5.0/en/create-table-select.html CREATE TABLE ... SELECT erstellt automatisch keine Indizes für Sie. Dies geschieht absichtlich, um die Aussage so flexibel wie möglich zu gestalten. Wenn Sie Indizes in der erstellten Tabelle haben wollen, sollten Sie diese vor der SELECT-Anweisung angeben: mysql> CREATE TABLE-Leiste (UNIQUE (n)) SELECT n FROM foo; –

0

CREATE TABLE neue_tabelle LIKE old_table;

oder u kann diese verwenden

CREATE TABLE new_table als SELECT * FROM OLD_TABLE WHERE 1 GROUP BY [Säule Duplikate zu entfernen, indem];

Verwandte Themen