SQL Fremdschlüssel

Hallo,

bin gerade am verzweifeln. Ich versuche die Tabelle „Projekt“ mit der Tabelle „Abteilung“ zu verknüpfen. In dieser Tabelle „Projekt“ gibt es eine spalte „P_Abteilung“.
Da ich beim eingeben der Daten nicht immer die Namen der Abteilungen schreiben möchte, habe ich mir die Tabelle „Abteilungen“ angelegt. Folgende Codes dazu.

CREATE TABLE abteilung (
A_ID INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
A_Abteilung CHAR(50));

CREATE TABLE projekt (
P_ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
P_Name Char(35),
P_Antragsteller Char(20),
P_Abteilung CHAR(50),
P_Startdatum DATE,
P_Enddatum DATE,
P_Dauer INT,
CONSTRAINT Foreign Key (P_Abteilung)
REFERENCES abteilung (A_Abteilung)
);

Beim ausführen zum erstellen der tabelle projekt bekomme ich immer den fehler:

Can’t create table ‚projektmanagement_db.projekt‘ (errno: 150)

-> dieser verweist daruf, dass mit dem FK was nicht passt.

Vielen Dank für eure Antworten!

LG Simon

CREATE TABLE abteilung (
A_ID INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
A_Abteilung CHAR(50));

CREATE TABLE projekt (

P_Abteilung CHAR(50),

CONSTRAINT Foreign Key (P_Abteilung)
REFERENCES abteilung (A_Abteilung)
);

Die Referenz ist nicht eindeutig. Werte in der Spalte abteilung.A_Abteilung können mehrfach vorkommen, genauso wie auch Werte in projekt.P_Abteilung. Wenn eine n:m-Zuordnung von Dir gewünscht ist, dann musst Du eine Zwischentabelle anlegen.

Wenn eine n:m-Zuordnung von
Dir gewünscht ist, dann musst Du eine Zwischentabelle anlegen.

Hallo,

soll heissen ich brauche noch eine Tabelle zb. „abteilungid“, welche dann ai_id als primarykey hat und A_Abteilung und P_Abteilung enthält?

Hallo,

Zwei Probleme gab es im ursprünglichen Befehl:

  1. Der Typ des Fremdschlüssels und der Typ des
    Primärschlüssels, auf den er verweist, müssen
    identisch sein. Wenn also A_ID in Abteilung
    ein INT ist, muss auch P_Abteilung in projekt
    ein INT sein.
  2. In der REFERENCES-Klausel wurde auf ein Attribut
    in abteilung verwiesen, das nicht Primärschlüssel
    von abteilung ist.

Folgender Befehl müsste funktionieren:

CREATE TABLE projekt (
P_ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
P_Name Char(35),
P_Antragsteller Char(20),
P_Abteilung INT,
P_Startdatum DATE,
P_Enddatum DATE,
P_Dauer INT,
CONSTRAINT Foreign Key (P_Abteilung)
REFERENCES abteilung (A_ID)
);

Mit freundlichen Grüßen

Michael Skusa

Hi,

P_Abteilung bzw. A_Abteilung sollten Textfelder sein. Ich dachte mit der Tabelle „Abteilung“ verkleinere ich einwenig meine „projekt“ Tabelle, welche noch sehr umfangreich wird. umd Select-Statements schneller zu machen wollte ich daher diesen FK legen.

Habe mir nun eine neue Tabelle abteilungid angelegt und damit funktionierts.

Besten dank für eure Antworten!

Wenn ich Dich richtig verstanden habe, dann würde das funktionieren, ist aber unnötig kompliziert.

Du entfernst zunächst projekt.P_Abteilung. Die Zuordnung von Abteilungen zu Projekten machst Du über eine zusätzliche Verknüpfungs- Tabelle (Name z.B. abt_proj_nm), die jeweils auf die primary keys der Tabellen projekt und abteilung referenziert. Diese Verknüfungs- Tabelle braucht selbst keinen primary key, weil Du in dieser nicht sortieren musst.

Hi!

Sorry, ich bin eher auf Oracle und Access.
Wenn es ein Syntax-Problem ist, kann ich nicht weiter helfen.

Eine Sache ist mir aber aufgefallen.
Hier ein Screenshot, um meine Meinung zu veranschaulichen:

http://img89.imageshack.us/img89/1706/abteilung.jpg

Du verbindest 2 char miteinander. Den Sinn dahinter verstehe ich nicht ganz.
Besser wäre folgendes:
P_Abteilung CHAR(50) in P_Abteilung INT verwandeln
und dann mit A_ID verbinden.

Ansonsten… kann es sein, dass eine weitere Tabelle auf P_Abteilung zugreift?

Auch hallo,

Syntax: muss denn CONSTRAINT da stehen?
Hier wäre doch ein Hinweis auf den verwendeten
SQL-Server usw. vielleicht hilfreich?

Andreas

Hab damit bislang keine erfahrung gemacht, aber auf dem link unten scheint die syntax für mysql gut beschrieben zu sein, vielleicht hilft dir das weiter.

http://dev.mysql.com/doc/refman/5.1-olh/de/innodb-fo…

Ich glaube, hier fehlt einfach der Name der Beziehung:


CONSTRAINT fk_auf_abteilungsnamen Foreign Key (P_Abteilung)
REFERENCES abteilung (A_Abteilung)
);

Hi,

nein gibt auch einfach nur den Error aus.

Danke für die Antwort :smile:

Servus,

Constraint ist nicht zwingend notwendig. Nutze den SQL Manager 2011 for MySQL.

LG

Servus,

nein - auf A_Abteilung bzw. A_ID greift nur P_Abteilung zu -> möchte mir ja die Daten von der Tabelle ‚abteilung‘ holen und in P_Abteilung einspeisen.

LG

Hallo,
Fehlt evtl. noch ein Verweis auf die Datenbankengine?
(InnoDB)

>Nutze den SQL Manager :2011 for MySQL.
Da hast du dich ja mit den Infos zum System
richtig weit aus dem Fenster gehängt!

Deswegen auch nur kurze und knappe Antwort.

Andreas

okaaay…

sorry, bin etwas verwirrt. Diese Art ist mit etwas neu.
Aber ich bin neugierig. Hast du Lust auf Skype?
Ich schickt dir mal ne Email.

Hallo,
versuch mal den Fremdschlüssel auf den Primary-Key der anderen Tabelle zu erstellen, dann sollte es klappen
mfg Wolfgang

Sorry hatte letzte Woche keinen Rechner mit DB-Zugang. Jetzt habe ich gerade nochmal geguckt und im Wikipedia diesen Hinweis gefunden:

„The columns in the referencing table must reference the columns of the primary key or other superkey in the referenced table.“

Wenn man dann drüber nachdenkt ist es wohl auch sinnvoll die Verknüpfung über den key zu machen - es soll ja gerade die Doppelerfassung des Abteilungsnamens entfallen, oder?
Die Tabelle Projekte muss also ein Feld mit dem selben Definitionen wie A_ID enthalten (und nicht wie A_Abteilung) und darauf dann den Fremdschlüssel legen.

Bei Großrechner-DB2 ist allerdings vorweg noch die Definition eines Indexes auf den Primärschlüssel erforderlich (Ohne den Index kann ich die Tabelle nicht mal zum Lesen ansprechen - und auch keinen Fremdschlüsselbezug drauf legen - ohne Index kommt: ‚die Tabellenschema-Deklaration ist unvollständig‘
In Oracle dagegen wird der Index automatisch mit angelegt (mit dem Primärschlüssel) - da ist die Erzeugung also nicht nötig.
(hier trotzdem in Großrechnernotation):

CREATE TABLE ABTEILUNG
(A_ID INT NOT NULL,
A_ABTEILUNG CHAR(50),
PRIMARY KEY (A_ID)
);

CREATE UNIQUE INDEX INDEX_GA
ON ABTEILUNG (A_ID);
COMMIT;

CREATE TABLE G_PROJEKT (
P_ID INT NOT NULL,

P_ANTRAGSTELLER CHAR(20),
P_ABT_ID INT NOT NULL,

PRIMARY KEY (P_ID),
FOREIGN KEY FK_ABNAME (P_ABT_ID)
REFERENCES ABTEILUNG (A_ID)
);

hallo,
ich würde mal sagen, du must anstatt REFERENCES abteilung (A_Abteilung) folgendes schreiben: REFERENCES P_abteilung (A_Abteilung).

es ist nämlich nicht möglich eine reference auf ein nicht existierendes feld anzulegen.

ansonsten müßte ich schon noch wissen, welche datenbank du benutzt.

tschuess

P_Abteilung muss INT sein.

Hallo,

ich kann kein Fehler finden, auf meiner MySQL datenbank lässt es sich auch ohne Probleme anlegen.

Vielleicht ist euer MySQL Server veraltet?

Lg Frank