# SQL Tabelle anlegen

`SQL Tabelle anlegen` ist der Schritt **vor** `Neu`: die Tabelle gibt es noch nicht.
Der Dialog fragt Verbindung, Tabellenname und Spalten ab und lässt das Portalskript ein
`CREATE TABLE` ausführen – auf MySQL oder MS SQL, je nachdem, was in der `dbConn.json`
zu dieser Verbindung steht.

## Wo die Tabelle entsteht

| Feld | Bedeutung |
|---|---|
| **Verbindung** | Die DEXPRO-Datenbank, in der die Tabelle angelegt wird. Workflow, DOCUMENTS und Squeeze stehen nie zur Wahl – siehe [Geschützte Datenbanken](/books/tableservice-konfiguration-neu/page/geschutzte-datenbanken) |
| **Tabellenname** | Buchstaben, Ziffern und `_`, beginnend mit einem Buchstaben oder `_`, höchstens 63 Zeichen. Ein Name, den es in dieser Datenbank schon gibt, wird abgewiesen |

## ID und Licence sind immer dabei

Jede so angelegte Tabelle beginnt mit denselben zwei Spalten wie jede ausgelieferte
DEX-Tabelle:

| Spalte | Form |
|---|---|
| `ID` | `BIGINT`, Primärschlüssel, von der Datenbank hochgezählt |
| `Licence` | `varchar(50)`, `NOT NULL`, Standardwert ist der Mandant dieser Anmeldung |

Beide zeigt der Dialog nur an. Anlegen, ändern oder weglassen kann sie niemand – das
entscheidet das Portalskript.

Damit ist der Primärschlüssel erschöpft: eine weitere Schlüsselspalte bietet der Dialog
nicht an, und ohne Schlüssel gibt es auch keinen Auto-Wert, denn eine hochzählende
Spalte muss der Schlüssel sein. In den Spaltenzeilen stehen **PK** und **Auto** deshalb
nur als Strich.

## Die eigenen Spalten

Je Zeile: Name, Typ, Länge, Standardwert und der Haken **NULL**.

| Typ | MS SQL / MySQL | Länge |
|---|---|---|
| Text | `NVARCHAR(n)` / `VARCHAR(n)` | Zeichenzahl, Vorgabe 255 |
| Langtext | `NVARCHAR(MAX)` / `LONGTEXT` | – |
| Zeichen (feste Länge) | `NCHAR(n)` / `CHAR(n)` | Vorgabe 10 |
| Ganzzahl | `INT` | – |
| Ganzzahl (groß) | `BIGINT` | – |
| Ganzzahl (klein) | `SMALLINT` | – |
| Dezimalzahl | `DECIMAL(p,s)` | Stellen,Nachkommastellen – z. B. `18,2` |
| Gleitkommazahl | `FLOAT` / `DOUBLE` | – |
| Ja/Nein | `BIT` / `BIT(1)` | – |
| Datum | `DATE` | – |
| Datum und Zeit | `DATETIME` | – |
| Binärdaten | `VARBINARY(MAX)` / `LONGBLOB` | – |

* **NULL** – ohne diesen Haken muss jede neue Zeile einen Wert mitbringen, oder die
  Spalte braucht einen Standardwert.
* **Standardwert** – bei Datum und Zeit steht `now` für die aktuelle Zeit
  (`GETDATE()` bzw. `CURRENT_TIMESTAMP`).
* Spaltennamen folgen derselben Regel wie der Tabellenname. Doppelte Namen und die
  beiden festen Namen `ID` und `Licence` werden abgewiesen.

## SQL anzeigen

`SQL anzeigen` holt das fertige Statement vom Portalskript und zeigt es in der
Statuszeile – **ausgeführt ist dabei noch nichts**. Das Statement wird nicht in der
Seite zusammengebaut, sondern im Backend aus geprüften Bausteinen; die Vorschau ist
also genau das, was später läuft.

## Anlegen

`Anlegen` führt das `CREATE TABLE` aus. Der Fortschrittskasten bleibt stehen, bis die
Datenbank geantwortet hat.

Ist **Definition dazu anlegen** angehakt, steht anschließend gleich eine neue
Definition offen – mit den Spalten der frisch angelegten Tabelle, noch ungespeichert.
Der Name wird aus dem Tabellennamen abgeleitet und ist frei wählbar.

> **Fallen lassen kann der Editor eine Tabelle nicht.** Ein `DROP TABLE` gibt es hier
> nicht – das bleibt Sache der Datenbank. Einzelne selbst angelegte Spalten lassen sich
> über [SQL Tabelle ändern](/books/tableservice-konfiguration-neu/page/sql-tabelle-andern) wieder löschen.