Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
computer:tutorials:sql:create_table [2011/03/01 19:39] christian angelegt |
computer:tutorials:sql:create_table [2013/05/15 10:16] christian |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | Tabellen werden mithilfe des **CREATE TABLE**-Befehls angelegt. Dieser Befehl definiert neben dem Tabellennamen auch die Felderstruktur. | ||
+ | |||
+ | ======Syntax====== | ||
+ | Der Syntax lautet wie folgt: | ||
+ | |||
<code> | <code> | ||
- | CREATE TABLE KUNDEN (KND_Nr int PRIMARY KEY AUTO_INCREMENT, KND_Vorname char(50) NOT NULL, | + | CREATE TABLE [IF NOT EXISTS] <Tabellen-Name> (Feld1, Feld2, Feld3,...); |
- | KND_Nachname char(50) NOT NULL, KND_Firma char(50) NOT NULL, KND_Strasse char(50) NOT NULL, | + | |
- | KND_PLZ char(5) NOT NULL, KND_Ort char(30) NOT NULL, KND_Notiz char(50)); | + | |
</code> | </code> | ||
+ | * **IF NOT EXISTS** ist hier optional - fehlt diese Option, meldet der **CREATE TABLE**-Befehl einen Fehler, falls die zu erstellende Tabelle bereits vorhanden ist. | ||
+ | * **<Tabellen-Name>** steht für den Name der zu erstellenden Tabelle | ||
+ | |||
+ | Die zu definierenden Felder werden nach dem Tabellen-Namen in runden Klammern aufgelistet. Jede Definition besteht aus mindestens zwei Feldern: | ||
<code> | <code> | ||
- | CREATE TABLE ARTIKEL (ART_Nr int PRIMARY KEY AUTO_INCREMENT, ART_Bezeichnung char(30) NOT NULL, | + | <Name> <Datentyp> [OPTIONEN] |
- | ART_Details char(50) NOT NULL, ART_Auslauf bool NULL, ART_StckPreis float NOT NULL); | + | |
</code> | </code> | ||
+ | * **<Name>>** steht für den Namen des zu erstellenden Felds, beispielsweise **Kunde_Name** | ||
+ | * **<Datentyp>** steht für den zu verwendenden [[datentypen|Datentyp]], beispielsweise **int** | ||
+ | Einige verfügbare Optionen: | ||
+ | ^Option^Beschreibung^ | ||
+ | |NULL|Feld muss nicht ausgefüllt werden (//Standard//)| | ||
+ | |NOT NULL|Feld muss ausgefüllt werden| | ||
+ | |PRIMARY KEY|Feld ist Primärschlüssel| | ||
+ | |AUTO_INCREMENT|Primärschlüssel wird automatisch hochgezählt| | ||
+ | |DEFAULT|Standardmäßig zuzuweisender Wert, falls nicht anders angegeben. Beispiel: ''DEFAULT 1337''| | ||
+ | |COMMENT|Kommentar zur Beschreibung der Spalte, lässt sich mit "**SHOW FULL COLUMNS FROM**" anzeigen.| | ||
+ | |||
+ | Die Optionen lassen sich durch ein Leerzeichen getrennt kombinieren - beispielsweise ''PRIMARY KEY AUTO_INCREMENT COMMENT "Key"''. | ||
+ | |||
+ | Beispiel: | ||
+ | |''CREATE TABLE foo (''|Tabellenname "**foo**"| | ||
+ | |'' id INT PRIMARY KEY AUTO_INCREMENT,''|Ganzzahl "**id**" als Primärschlüssel, automatisch hochzählen| | ||
+ | |'' kommentar TEXT NOT NULL COMMENT "Textfeld",''|Optionales Feld "**kommentar**", mit Kommentar "//Textfeld//"| | ||
+ | |'' nummer INT DEFAULT 1337 COMMENT "Ganzzahl"''|Ganzzahl "**nummer**", Standardwert 1337, kit Kommentar "//Ganzzahl//"| | ||
+ | |'');''| | | ||
+ | ======Beispiel====== | ||
+ | Die folgende Tabelle dient als einfaches Beispiel - in ihr werden Namen und Telefonnumern gespeichert. | ||
+ | ^telefonbuch^^^ | ||
+ | ^(PK)id^name^telefonnummer^ | ||
+ | |...|...|...| | ||
+ | |||
+ | =====Einfache Tabelle===== | ||
+ | Erstellung einer einfachen Tabelle ohne Primärschlüssel: | ||
<code> | <code> | ||
- | CREATE TABLE BESTELLUNGEN (BST_Nr int PRIMARY KEY AUTO_INCREMENT, KND_Nr int NOT NULL, | + | CREATE TABLE telefonbuch (name text, telefonnummer text); |
- | BST_Datum date NOT NULL, BST_Bezahlt bool); | + | |
</code> | </code> | ||
+ | =====Einfache Tabelle mit NOT NULL===== | ||
+ | In der bisherigen Tabelle lassen sich leere Eintragungen vornehmen: | ||
<code> | <code> | ||
- | CREATE TABLE BESTELL_POS (BPOS_Nr int PRIMARY KEY AUTO_INCREMENT, BST_Nr int NOT NULL, | + | mysql> INSERT INTO telefonbuch (name, telefonnummer) VALUES (NULL, NULL); |
- | ART_Nr int NOT NULL, BPOS_Anzahl int NOT NULL, BPOS_Einzelpreis float NOT NULL); | + | Query OK, 1 row affected (0.00 sec) |
+ | |||
+ | mysql> SELECT * FROM telefonbuch; | ||
+ | +----------------+---------------+ | ||
+ | | name | telefonnummer | | ||
+ | +----------------+---------------+ | ||
+ | | NULL | NULL | | ||
+ | +----------------+---------------+ | ||
</code> | </code> | ||
+ | Mithilfe des Schlagworts **NOT NULL**, welches den beiden Feldern **text** und **telefonnummer** übergeben wird, kann das verhindert werden - leere Eintragungen sind dann nicht mehr möglich: | ||
+ | <code> | ||
+ | mysql> DROP TABLE telefonbuch | ||
+ | mysql> CREATE TABLE telefonbuch (name text NOT NULL, telefonnummer text NOT NULL); | ||
+ | Query OK, 0 rows affected (0.01 sec) | ||
+ | mysql> insert into telefonbuch (name, telefonnummer) VALUES (NULL, NULL); | ||
+ | ERROR 1048 (23000): Column 'name' cannot be null | ||
+ | |||
+ | mysql> insert into telefonbuch (name, telefonnummer) VALUES ("Max Mustermann", "0815/1337666"); | ||
+ | Query OK, 1 row affected (0.00 sec) | ||
+ | </code> | ||
+ | |||
+ | =====Tabelle mit Primärschlüssel und AUTO_INCREMENT===== | ||
+ | Bisher verwendet die Tabelle keinen Primärschlüssel - es gibt also keinen einzigartigen Identifikator für die einzelnen Datensätze. | ||
+ | Mithilfe des Schlagworts **PRIMARY KEY** wird ein Feld (//idealerweise eine Ganzzahl; **int**//) zum Primärschlüssel definiert. Jeder Datensatz muss daraufhin einen einzigartigen Primärschlüssel haben. | ||
+ | |||
+ | Standardmäßig muss der Primärschlüssel für jeden Eintrag manuell definiert werden. Mithilfe des Schlagworts **AUTO_INCREMENT** lässt sich eine automatische Hochzählung der Einträge bewerkstelligen - wenn der Primärschlüssel als **AUTO_INCREMENT** definiert wird, wird er automatisch hochgezählt (//1,2,3,..//). | ||
+ | |||
+ | <code> | ||
+ | mysql> CREATE TABLE telefonbuch (id int PRIMARY KEY AUTO_INCREMENT, name text NOT NULL, telefonnummer text NOT NULL, notiz text NULL); | ||
+ | Query OK, 0 rows affected (0.00 sec) | ||
+ | |||
+ | mysql> insert into telefonbuch (name, telefonnummer) VALUES ("Max Mustermann", "0815/1337666"); | ||
+ | Query OK, 1 row affected (0.00 sec) | ||
+ | |||
+ | mysql> insert into telefonbuch (name, telefonnummer, notiz) VALUES ("Maxima Mustre", "0800/1338667", "Test"); | ||
+ | Query OK, 1 row affected (0.00 sec) | ||
+ | |||
+ | mysql> SELECT * FROM telefonbuch; | ||
+ | +----+----------------+---------------+-------+ | ||
+ | | id | name | telefonnummer | notiz | | ||
+ | +----+----------------+---------------+-------+ | ||
+ | | 1 | Max Mustermann | 0815/1337666 | NULL | | ||
+ | | 2 | Maxima Mustre | 0800/1338667 | Test | | ||
+ | +----+----------------+---------------+-------+ | ||
+ | 2 rows in set (0.00 sec) | ||
+ | </code> |