Home
SQL / MySQL
Datenbanken?
  ---------------
Select
Insert
Update
Delete
  ---------------
Where
Order By
Group By
  ---------------
Create Table
Alter Table
Rename Table
Drop Table
Optimize Table
Repair Table
Backup Table
Restore Table
Show Tables
Describe Table
  ---------------
Use DB
Create DB
Drop DB
Show DBs
  ---------------
Funktionen
Indizes
Fulltext
Feldtypen
Gästebuch
Download
Kontakt
 
57956 Seitenaufrufe

Create Table - Statement


  1. Eine neue Tabelle per SQL-Statement erzeugen
  2. Eine neue Tabelle aus bereits bestehenden Tabellen erzeugen
  3. Beispiele zum Erstellen von Tabellen

Bedeutung:
Mit der CREATE TABLE-Anweisung lassen sich Tabellen in einer bereits existierenden(!) Datenbank anlegen.


Hinweis:
Wegen der Fülle von Optionen bei diesem Statement werde ich hier nur die grundlegensten (!) Möglichkeiten aufzeigen. Wichtig zum Verständnis von CREATE TABLE sind vor allem die Datentypen/Feldtypen von MySQL.


Eine neue Tabelle per SQL-Statement erzeugen

Allgemeine Form:
CREATE TABLE IF NOT EXISTS tabellenname
(
 feld1 int(10) NOT NULL auto_increment,
 feld2 char(2) NOT NULL DEFAULT 'AB' ,
 feld3 varchar(255) NOT NULL DEFAULT '' ,
 feld4 text NOT NULL DEFAULT '' ,
 PRIMARY KEY (feld1)
)

Der optionale Zusatz IF NOT EXISTS verhindert die Ausgabe einer Fehlermeldung falls die Tabelle tabellenname bereits besteht. Am Schluß des obigen Satements wird noch ein Primärschlüssel/Index angelegt. Alle Feldnamen sowie der jeweilige Feldtyp stehen zwischen den beiden Klammern. Hinter jedem Feldnamen steht die genauere Spezifizierung des Feldtyps.

Hinter dem jeweiligen Feldtyp ist bei drei Feldern noch ein DEFAULT-Wert angegeben. Werden später Werte in die Tabelle eingefügt so brauchen diese Felder beim INSERT-Statement nicht mit angegeben werden - sofern der einzutragende Wert dem DEFAULT-Wert des Feldes entspricht.

Das Feld feld1 ist als auto_increment spezifiziert. Dieses Feld wird bei späteren INSERT-Statements automatisch mit einem (eindeutigen) Zahlenwert von 1 bis X gefüllt. Dieses Feld braucht bei INSERT-Statements deshalb nicht mit angegeben werden.

Hinweis:
Ein AUTO_INCREMENT Feld sollte in jeder Tabelle vorhanden sein. In vielen Fällen kann man bei einem späteren UPDATE-Statement nur so jeden Datensatz wirklich eindeutig adressieren.



Eine neue Tabelle aus einer bereits bestehenden Tabelle erzeugen
Es ist auch möglich, aus einer bereits bestehenden Tabelle eine neue Tabelle zu erzeugen. Die Daten der bereits bestehenden Tabelle können wahlweise mit übernommen werden.

Allgemeine Form:
Ohne Datenübernahme
CREATE TABLE IF NOT EXISTS tabelleNeu
SELECT * FROM tabelleAlt
WHERE 0 = 1

Da die WHERE-Bedingung niemals zutrifft wird auch kein Datensatz aus der bestehenden Tabelle ausgewählt. Deshalb wird nur die Struktur (alle Felder!) der alten Tabelle in die neue übernommen.

Mit Datenübernahme
CREATE TABLE IF NOT EXISTS tabelleNeu
SELECT * FROM tabelleAlt

Hier werden sowohl die Struktur (alle Felder!) als auch die Daten der alten Tabelle übernommen. INDIZES werden nicht übernommen!


Möchte man nur bestimmte Felder aus der bereits bestehenden Tabelle bzw. aus den bereits bestehenden Tabellen übernehmen so müssen diese wie in einem normalen SELECT-Statement mit angegeben werden.

Beispiel:
CREATE TABLE IF NOT EXISTS tabelleNeu
SELECT
tabelleAltEins.feld1,
tabelleAltEins.feld2,
tabelleAltZwei.feld1,
tabelleAltZwei.feld4,
tabelleAltZwei.feld5
FROM tabelleAltEins, tabelleAltZwei
WHERE tabelleAltZwei.feld4 = 'wert'

Im obigen Beispiel werden nur die fünf angegebenen Felder in der neuen Tabelle angelegt. Es werden nur die Daten aus den beiden bestehenden Tabellen übernommen, die die WHERE-Bedingung erfüllen.



Beispiele zum Erstellen von Tabellen
Um den Einstieg in das Erstellen von Tabellen zu erleichtern sind unten beispielhaft drei CREATE-Statements wiedergegeben. Ich habe die Statements bewußt nach Numerischen-, String- und Datumstypen getrennt. Natürlich kann man die Feldtypen auch zusammen verwenden.

Teilweise sind optionale Angaben zu den jeweiligen Feldtypen gemacht worden. Jedes Statement enthält einen PRIMARY KEY vom Typ tinyint(3). Dieses Feld ist jeweils zusätzlich als AUTOINCREMENT deklariert, wird also beim Füllen der Tabelle automatisch gefüllt. Neben dem PRIMARY KEY enthalten die beiden ersten Statements noch weitere INDIZES. Der eine INDEX davon ist als UNIQUE deklariert.

Hinter dem jeweiligen Feldnamen folgt der Feldtyp. Danach folgt entweder die maximale Länge, das Format oder die Liste der aufnehmbaren Werte. In vielen Fällen ist danach der DEFAULT-Wert angegeben. Am Schluß fast jeder Feld-Definition ist nochmal angegeben, ob das Feld den Wert 'NULL' (nicht zu verwechseln mit mit der Zahl '0', NULL bedeutet hier soviel wie 'Nichts') haben kann. Soweit möglich sollte man aus Performancegründen alle Felder als NOT NULL deklarieren.

a) Erstellen einer Tabelle mit numerischen Feldtypen:

CREATE TABLE IF NOT EXISTS numerischeTabelle
 (
  feld1 tinyint(4) NOT NULL auto_increment,
  feld2 mediumint(9) DEFAULT '0' NOT NULL,
  feld3 int(11) unsigned DEFAULT '0' NOT NULL,
  feld4 bigint(20) unsigned zerofill,
  feld5 float DEFAULT '0' NOT NULL,
  feld6 double(4,2) DEFAULT '0.00' NOT NULL,
  PRIMARY KEY (feld1),
  UNIQUE feld5 (feld5),
  KEY feld2 (feld2)
 )


b) Erstellen einer Tabelle mit String-Feldtypen:

CREATE TABLE IF NOT EXISTS stringTabelle
 (
  feld1 tinyint(3) unsigned NOT NULL auto_increment,
  feld2 varchar(32) DEFAULT 'ABC',
  feld3 tinytext,
  feld4 mediumtext,
  feld5 text,
  feld6 longtext,
  feld7 tinyblob,
  feld8 mediumblob,
  feld9 blob,
  feld10 enum('A','B','C','D','E') DEFAULT 'A' NOT NULL,
  feld11 set('a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p'),
  PRIMARY KEY (feld1),
  KEY feld10 (feld10)
 )


c) Erstellen einer Tabelle mit Datums-Feldtypen:

CREATE TABLE IF NOT EXISTS datumTabelle
 (
  feld1 tinyint(3) NOT NULL auto_increment,
  feld2 datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
  feld3 timestamp(14),
  feld4 time DEFAULT '00:00:00' NOT NULL,
  feld5 year(4) DEFAULT '0000' NOT NULL,
  PRIMARY KEY (feld1)
 )
 
Letzte Änderung: 17. Mai 2002, 22:26 Uhr


© 2002, Klaus Becker, becker-k@web.de