Tabellenerzeugung FK wird nicht akzeptiert

DerEisige

Erfahrenes Mitglied
Guten Abend,
ich habe ein kleines Problem beim erstellen einer Tabelle.

Ich bekomme immer beim erstellen der Table Teilnahme die Fehlermeldung
Code:
#1005 - Kann Tabelle `test`.`teilnahme` nicht erzeugen (Fehler: 150 "Foreign key constraint is incorrectly formed") (Details…)

Datenbanksystem ist ein MariaDB 10.1.32 und dass ist mein SQL Code
SQL:
CREATE TABLE Veranstaltung (
  id int(10) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name varchar(255) NOT NULL,
  beschreibung  TEXT,
  kosten DECIMAL NOT NULL,
  maxteilnehmer int(10) ,
  ort varchar(255) NOT NULL,
  datum timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;



CREATE TABLE Teilnahme (
  id int(10) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
  mail varchar(255) NOT NULL,
  pin int(4) NOT NULL,
  zahlung BOOLEAN NOT NULL DEFAULT FALSE,
  mahnung int(2) NOT NULL DEFAULT '0',
  veranstaltung int(10) NOT NULL,
  datum timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  CONSTRAINT FK_TeilnahmeVeranstaltung FOREIGN KEY(veranstaltung) REFERENCES veranstaltung(id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
 

Zvoni

Erfahrenes Mitglied
Was sagt denn SHOW ENGINE INNODB STATUS ?

EDIT: Gibts da nicht eine Namenskollision?
Tabelle1 heisst "Veranstaltung", der FK in Tabelle2 "veranstaltung"
Hast du mal versucht einen anderen Spaltennamen für den FK zu benutzen (Bsp. Veranstaltung_ID)?

EDIT2: Sehs gerade: Dein PK in Veranstaltung ist unsigned, der FK nicht.
Häng mal ein UNSIGNED rein
veranstaltung int(10) unsigned NOT NULL,
 
Zuletzt bearbeitet:

Zvoni

Erfahrenes Mitglied
Huh? Wo soll denn da die Logik dahinter sein?

Bei einem Auto-Increment kommen ja nie negative Zahlen zustande. Der fängt schliesslich bei 1 an
Habs auf der SQLfiddle gerade mit unsigned bei beiden Feldern getestet. Kein Fehler.
 

Fragenfrager

Erfahrenes Mitglied
Zum "Unsigned"-Attribut bei IDs:
Es stimmt zwar, dass (in den meisten Fällen) die ID bei 0 oder 1 anfängt und damit durch autoincrement keine negativen Zahlen auftauchen können.
Allerding verliert man die Hälfte der verfügbaren Werte, wenn man unsigned nicht verwendet.
Für den Großteil der DBAs, die sich hier rumtreiben wird das egal sein. Ich hatte aber auch schon Kunden, bei denen die DB nach 2.147.483.647 Datensätzen die Hufe hochgerissen hat.
Von daher sollte man - sofern das Datenbanksystem es unterstützt, bei IDs grundsätzlich mit unsigned arbeiten. Es ist einfach der sauberere Stil.