joey: Wo ist der Fehler

Morgen zusammen,

ich habe folgenden Code generieren lassen und kann ihn nicht einlesen, da ich immer den FehlerCode 1064 bekomme. Leider verstehe ich nicht, was er bedeutet. Kann mir jemand helfen?

Hier mein SQL-Statement

create table 'Lehrer' (
   'Name' varchar(80),
   'Alter' float,
   'Adresse' varchar(80),
   primary key ('Name')
);

insert into Lehrer values('Meier', 35, 'Pfaffenhofen');
insert into Lehrer values('Schulze', 34, 'Freising');
insert into Lehrer values('Schmidt', 31, 'Dachau');
insert into Lehrer values('Huber', 34, 'Dachau');
insert into Lehrer values('Werner', 55, 'Freising');

Hier die Fehlerbeschreibung

Error: 1064 SQLSTATE: 42000 (ER_PARSE_ERROR)

Message: %s bei '%s' in Zeile %d

Was ist %s bzw %d?

  1. Hallo Joey,

    welches Datenbankmanagementsystem (DBMS) verwendest Du (inklusive Version)?

    create table 'Lehrer' (
       'Name' varchar(80),
       'Alter' float,
       'Adresse' varchar(80),
       primary key ('Name')
    );

    Ist das exakt das Statement zur Erzeugung der Tabelle? Welches Datenbankmanagementsystem akzeptiert einfache Anführungszeichen in Tabellen- und Spaltennamen? Ich weiß, dass MySQL Backticks schluckt, damit man reservierte Worte wie z.B. "Alter" als Namen verwenden kann, andere DBMS hätten gerne eckige Klammern für diesen Zweck.

    insert into Lehrer values('Meier', 35, 'Pfaffenhofen');

    [...]

    Die INSERT-Operationen sollten erfolgreich sein, sofern die Tabelle angelegt werden kann.

    Anmerkungen:
    Die Spalte "Name" ist extrem ungünstig als Träger des Primärschlüssels.
    Eine Spalte "Alter" trägt einen ungünstigen Namen und ist nicht besonders sinnvoll, da sich der Inhalt ständig ändert, eine Spalte Geburtsdatum oder -jahr wäre besser :-)

    Freundliche Grüße

    Vinzenz

    1. yo,

      Die Spalte "Name" ist extrem ungünstig als Träger des Primärschlüssels.

      vielleicht sollte man noch hinzufügen, warum der name ungünstig ist. ein primär-schlussel hat zwei eigenschaften, nämlich darf er nicht leer sein (not null) und die werte dürfen nur genau einmal vorkommen, sprich gleiche werte sind ausgeschlossen, um den datensatz eindeutig ansprechen zu können (Unique). der gleiche name kann aber durchaus mehr als einmal in der entsprechenden umgebung vorkommen und würde somit den Unique contraint verletzten, bzw. der gleiche name würde erst gar nicht aufgommen werden können. insofern bietet sich meistens ein künstlicher schlüssel mit auto-increment an.

      Ilja

      1. Die Spalte "Name" ist extrem ungünstig als Träger des Primärschlüssels.

        vielleicht sollte man noch hinzufügen, warum der name ungünstig ist. ein primär-schlussel hat zwei eigenschaften, nämlich darf er nicht leer sein (not null) und die werte dürfen nur genau einmal vorkommen, sprich gleiche werte sind ausgeschlossen, um den datensatz eindeutig ansprechen zu können (Unique). der gleiche name kann aber durchaus mehr als einmal in der entsprechenden umgebung vorkommen und würde somit den Unique contraint verletzten, bzw. der gleiche name würde erst gar nicht aufgommen werden können. insofern bietet sich meistens ein künstlicher schlüssel mit auto-increment an.

        Dem möchte ich ein bisschen wiedersprechen. Ein name kann und sollte durchaus unique sein, wenn es ein Loginname ist. Es ist zwar wegen der performance sicher besser einen künstlichen Schlüssel zu verwenden, aber durch uniques verhindert man auf jeden Fall doppelte Namen.

        Struppi.

    2. create table 'Lehrer' (
         'Name' varchar(80),
         'Alter' float,
         'Adresse' varchar(80),
         primary key ('Name')
      );

      Ist das exakt das Statement zur Erzeugung der Tabelle? Welches Datenbankmanagementsystem akzeptiert einfache Anführungszeichen in Tabellen- und Spaltennamen?

      Ich benutze MAMP.

      Ich weiß, dass MySQL Backticks schluckt, damit man reservierte Worte wie z.B. "Alter" als Namen verwenden kann, andere DBMS hätten gerne eckige Klammern für diesen Zweck.

      Daran hatte ich gar nicht gedacht.

      Anmerkungen:
      Die Spalte "Name" ist extrem ungünstig als Träger des Primärschlüssels.

      Es ist auch nur ein Beispiel

      1. Hallo Joey,

        create table 'Lehrer' (
           'Name' varchar(80),
           'Alter' float,
           'Adresse' varchar(80),
           primary key ('Name')
        );

        ich wiederhole mich:

        Ist das exakt das Statement zur Erzeugung der Tabelle?

        Ich benutze MAMP.

        Steht das zweite M in dieser mir unbekannten Abkürzung für MySQL?
        Wenn ja, welche Version?

        Und nochmals: Ist das exakt das Statement zur Erzeugung der Tabelle? Alles andere als das verwendete Statement ist schlicht und einfach nutzlos.

        Anmerkungen:
        Die Spalte "Name" ist extrem ungünstig als Träger des Primärschlüssels.

        Es ist auch nur ein Beispiel

        Heißt das, dass es sich nicht um das Statement handelt, das die Fehlermeldung auslöst. Wenn ja, dann poste bitte exakt das Statement, das die Fehlermeldung hervorruft.

        Freundliche Grüße

        Vinzenz

        1. create table 'Lehrer' (
             'Name' varchar(80),
             'Alter' float,
             'Adresse' varchar(80),
             primary key ('Name')
          );

          Ist das exakt das Statement zur Erzeugung der Tabelle?

          Exakt

          1. Hallo

            create table 'Lehrer' (
               'Name' varchar(80),
               'Alter' float,
               'Adresse' varchar(80),
               primary key ('Name')
            );

            Ist das exakt das Statement zur Erzeugung der Tabelle?

            Wie bereits in meinem ersten Posting stand: Einfache Anführungszeichen sind in Tabellen- und Spaltennamen normalerweise nicht zugelassen.

            Tabellen- und Spaltennamen müssen normalerweise nicht maskiert werden.
            Wenn Du reservierte Wörter wie z.B. "Alter" verwendest, musst Du diese Namen so maskieren, wie das verwendete DBMS es verlangt, z.B. bei MySQL mit Backticks:

            ´Alter´

              
            create table Lehrer (     -- Lehrer  ist nicht reserviert  
                Name varchar(80),     -- Name    ist nicht reserviert  
                ´Alter´ float,        -- Alter   ist reserviert, daher maskiert  
                Adresse varchar(80),  -- Adresse ist nicht reserviert  
                primary key (Name)    -- Name    s.o.  
            );  
            
            

            Selbstverständlich kannst Du jede Bezeichnung sicherheitshalber maskieren, wie es z.B. phpMyAdmin macht, es ist jedoch nicht erforderlich. Ich persönlich bevorzuge die Verwendung von Spaltennamen, die Maskierung nicht erfordern :-)

            Wenn Du ein anderes DBMS verwendest, z.B. MS SQL-Server, so benötigst Du andere Maskierungszeichen, beim MS SQL-Server wird das reservierte Wort in eckige Klammern eingeschlossen:

            [Alter]

            Ein typischer Fall, der Maskierung erfordert, ist die Verwendung des Minus-Zeichens in Spaltennamen:

            [Tel-Nr] bzw. ´Tel-Nr´

            Ich kenne kein DBMS, das einfache Hochkomma als Maskierungszeichen verwendet, es ist natürlich nicht ausgeschlossen, dass es eines gibt.

            Freundliche Grüße

            Vinzenz

            1. Hi Vinzenz Mai,

              Tabellen- und Spaltennamen müssen normalerweise nicht maskiert werden.
              Wenn Du reservierte Wörter wie z.B. "Alter" verwendest, musst Du diese Namen so maskieren, wie das verwendete DBMS es verlangt, z.B. bei MySQL mit Backticks:

              ´Alter´

              _Back_ticks: `

              Gruß, Marian

              1. Hallo Marian,

                ´Alter´
                _Back_ticks: `

                aua, was für ein peinlicher Fehler!

                Ich weiß schon, warum ich Bezeichner verwende, die keine Maskierung erfordern :-)

                Freundliche Grüße

                Vinzenz