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] (aktuell) 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> | ||