CREATE TABLE

Guten Morgen,

auch ich steige gerade von MySQL auf Postgres um.
Mein erstes kleines Projekt: Die Datenbank für mein WLAN-Log überführen.
Dazu wollte ich diese neu anlegen und folgenden Code nutzen, um die nötige Tabelle zu erzeugen:

 CREATE TABLE wlan(
 id		       SERIAL,
 zeit          timestamp NOT NULL,
 user	       CHAR(20)  NOT NULL,
 mac           CHAR(12)  NOT NULL
 
 CONSTRAINT wlan PRIMARY KEY (id));

Dabei wirft mir Postgres allerdings folgenden Fehler:

FEHLER:  Syntaxfehler bei »user«
ZEILE 4:  user        CHAR(20) NOT NULL,
          ^

Setze ich den Spaltennamen “user” in Anführungszeichen, wirft er mir noch einen Fehler bzgl. des primary keys:

FEHLER:  Syntaxfehler bei »(«
ZEILE 7:  CONSTRAINT wlan PRIMARY KEY (id));

Hat jemand eine Idee?

user ist ein reserviertes Schlüsswort. Am besten verwendest Du einen anderen Spaltennamen.

Wenn Du unbedingt willst, kannst Du user verwenden, dann musst Du es aber in Anführungszeichen setzen:

CREATE TABLE wlan(
 id              SERIAL,
 zeit            timestamp NOT NULL,
 "user"          CHAR(20)  NOT NULL,
 mac             CHAR(12)  NOT NULL
 CONSTRAINT wlan PRIMARY KEY (id));

Das heisst aber auch, dass Du immer die Anführungszeichen verwenden musst. Das folgende Statement funktioniert zwar:

select id, zeit, user from wlan

liefert aber dann den aktuellen Datenbankbenutzer zurück, nicht den Wert aus der Spalte - was die Sache extrem hässlich macht (keine Syntaxfehler aber falsche Werte…)

Korrekt wäre nämlich

select id, zeit, "user" from wlan

Also am besten verwendest Du einen anderen Spaltennamen.

Ich bin mir übrigens zu 99,9% sicher, dass Du keine CHAR Spalte willst, sondern eine VARCHAR.

CHAR hat - wie im Handbuch auch dokumentiert - nämlich die unangenehme Eigenschaft den Wert mit Leerzeichen auf die definierte Länge zu bringen. Fügst Du also ein X ein, werden 19 Leerzeichen angehängt. Eine Abfrage mit WHERE “user” = ‘X’ liefert dann nichts zurück.

Ausserdem würde ich dem PK constraint einen anderen Namen als den der Tabelle geben, z.B. constraint pk_wlan

Und für die MAC Adresse bietet sich der eingebaute Datentyp macaddr an.

Hallo,

klar, wenn’s ein reserviertes Schlüsselwort ist, kann das natürlich nicht funktionieren!
Und richtig, ich wollte ein varchar, hab mich nur vertippt.
Gut zu wissen, dass es den Typ macaddr gibt! Hat er besondere Vorteile? Denn in einem 12er Char bekomme ich die Macadressen ja auch gut unter.

Danke, das war sehr hilfreich,
someone57

PS: Leider hilft das Umbenennen des PK nicht:

FEHLER: Syntaxfehler bei »(«
ZEILE 7: CONSTRAINT pk_wlan PRIMARY KEY (id));

Da fehlt noch ein Komma

CREATE TABLE wlan(
 id              SERIAL,
 zeit            timestamp NOT NULL,
 "user"          CHAR(20)  NOT NULL,
 mac             CHAR(12)  NOT NULL, --- < hier fehlt das Komma
 CONSTRAINT pk_wlan PRIMARY KEY (id));

Ah, super :slight_smile:
Dachte, es sei Absicht, dass dort kein Komma mehr gesetzt wird.

Noch eins:
Versuche gerade, aus einem Bash-Skript heraus, etwas in eine DB einzufügen.
Allerdings läuft das Skript nicht weiter, sondern hängt sich auf.
Es enthält nur eine Zeile:

#!/bin/bash

psql -U benutzername wlan -h localhost -c "insert into wlan (zeit, username, mac) values ('2013-04-07 23:38', 'peter', 'aaaaaaaaaaaa');"

Laut Google muss ich erst die Passwort-Authentifizierung für lokale Benutzer abstellen.
Wie mache ich das? Oder Alternativ: Gibt es einen Parameter, mit dem ich das Passwort direkt an den Befehl anhängen kann?

Grüße

Du kannst ~/.pgpass nutzen.

Hab’s nun hinbekommen, allerdings läuft das Bash-Skript sehr lange, um den einen Befehl auszuführen.
Gibt’s dafür nen Grund?
Denn setze ich den Befehl direkt in psql ab, läuft alles wunderbar schnell.

Es dauert etwa 2 Minuten, bis mich das Skript nach dem Passwort fragt und dann nochmal etwa genau so lang, bis der Insert-Befehl abgesetzt wird.

.pgpass ändert daran übrigens nichts, es bleibt arg langsam.
Habe einen zusätzlichen select-Befehl eingebaut, der ebenso lange braucht.

Edit:

Mache das Ganze jetzt mit perl, das geht sehr viel schneller :wink: