Wo ist der Fehler
joey
- datenbank
0 Vinzenz Mai1 Ilja0 Struppi
0 joey0 Vinzenz Mai0 Joey0 Vinzenz Mai0 Marian
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?
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
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
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.
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
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
create table 'Lehrer' (
'Name' varchar(80),
'Alter' float,
'Adresse' varchar(80),
primary key ('Name')
);
Ist das exakt das Statement zur Erzeugung der Tabelle?
Exakt
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
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
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