2014-05-06 1 views
6

Jestem całkiem nowym użytkownikiem MySQL (musiałem nauczyć się go dla uni). Muszę utworzyć bazę danych i interfejs WWW dla zadania.Używanie dwóch kluczy obcych jako klucza podstawowego - MySQL

Na jednej z tabel mam dwie kolumny, obie są obcymi kluczami, i muszę ich użyć jako klucza głównego.

Jest to kod do tej pory:

drop database if exists testJoke; 
create database testJoke; 
use testJoke; 

CREATE TABLE Author 
(
    id   int(11) NOT NULL , 
    name   varchar(255) NULL , 
    cust_email varchar(255) NULL, 
    password char(32) null, 

    PRIMARY KEY (id) 


); 


**CREATE TABLE AuthorRole 
(
    authorid int(11) NOT NULL , 
    roleid varchar(255) NOT NULL, 
    PRIMARY KEY (authorid, roleid), 
    FOREIGN KEY(authorid) REFERENCES Author(id), 
    FOREIGN KEY(roleid) REFERENCES Role(id) 

);** 



CREATE TABLE Category 
(
    id int(11)  NOT NULL , 
    name varchar(255) NULL, 
    PRIMARY KEY (id) 
); 


CREATE TABLE Joke 
(
    id int(11)  NOT NULL , 
    joketext text NULL , 
    jokedate date NOT NULL , 
    authorid int(11) NULL, 
    PRIMARY KEY (id), 
    FOREIGN KEY(authorid) REFERENCES Author(id) 

); 


CREATE TABLE JokeCategory 
(
    jokeid int(11)  NOT NULL , 
    categoryid int(11) NOT NULL , 
    PRIMARY KEY (jokeid, categoryid), 
    FOREIGN KEY(jokeid) REFERENCES Joke(id), 
    FOREIGN KEY(categoryid) REFERENCES Category(id)** 


); 

CREATE TABLE Role 
(
    id varchar(255)  NOT NULL , 
    description varchar(255) NULL , 
    PRIMARY KEY (id) 
); 

Wszystkie składni tabeli jest zgodna ze słownikiem danych dostarczonych.

Kiedy uruchamiam to w wierszu poleceń mysql, pojawia się błąd w sekcji wyróżnionej pogrubioną czcionką (tabela "AuthorRole"), mówiąc, że "nie można dodać ograniczenia klucza obcego".

miałem szansę na debugowanie to, i to wydaje się być:

FOREIGN KEY(roleid) REFERENCES Role(id) 

Klucz obcy, który jest przyczyną problemu (jeśli usunąć go, wszystko działa dobrze, a jeśli i zostawić go w i usunąć inny klucz obcy, daje błąd).

Jeśli ktoś mógłby wytłumaczyć, gdzie idę źle, byłbym bardzo wdzięczny.

Próbowałem googlować, ale nie mogłem niczego znaleźć (prawdopodobnie dlatego, że używałem niewłaściwych słów kluczowych).

Dzięki

Cheers Corey

Odpowiedz

0

Początkowo utworzyć tabeli „Rola”, a następnie w tabeli „AuthorRole” i to będzie ok

CREATE TABLE Role 
(
    id varchar(255)  NOT NULL , 
    description varchar(255) NULL , 
    PRIMARY KEY (id) 
); 

CREATE TABLE AuthorRole 
(
    authorid int(11) NOT NULL , 
    roleid varchar(255) NOT NULL, 
    PRIMARY KEY (authorid, roleid), 
    FOREIGN KEY(authorid) REFERENCES Author(id), 
    FOREIGN KEY(roleid) REFERENCES Role(id) 
); 

I podczas tworzenia kluczy podstawowych lepiej wykorzystywać id INT(11) NOT NULL AUTO_INCREMENT

+0

Cześć, To zadziałało! Dzięki za stosy. Spróbuję tego, co powiedziałeś dla kluczy podstawowych. Dzięki jeszcze raz. Pozdrawiam, Corey – Fishingfon

0

spróbować zmiana spowoduje

roleid varchar(255) NOT NULL, 

do

roleid int(11) NOT NULL, 

jako pole a pole klucza są różnych typów

+0

Witam, próbowałem zrobić to, co powiedziałeś, ale wciąż mam ten sam błąd. Zmieniłem go na typ "int (11)" w tabelach "Rola" i "AuthorRole". Dzięki, Corey – Fishingfon

+0

Inni odpowiedzieli na twoje pytanie, przegapiłem fakt, że kolejność, w której tworzysz tabele jest błędna –

3

Jest to po prostu dlatego, że jesteś odwołując się do klucza podstawowego tabeli, które nie jest tworzony w momencie odnosić się do niej, spróbuj następujące sql skrypt:

drop database if exists testJoke; 
create database testJoke; 
use testJoke; 

CREATE TABLE Author 
(
    id   int(11) NOT NULL , 
    name   varchar(255) NULL , 
    cust_email varchar(255) NULL, 
    password char(32) null, 

    PRIMARY KEY (id) 


); 

CREATE TABLE Role 
(
    id varchar(255)  NOT NULL , 
    description varchar(255) NULL , 
    PRIMARY KEY (id) 
); 


CREATE TABLE AuthorRole 
(
    authorid int(11) NOT NULL , 
    roleid varchar(255) NOT NULL, 
    PRIMARY KEY (authorid, roleid), 
    FOREIGN KEY(authorid) REFERENCES Author(id), 
    FOREIGN KEY(roleid) REFERENCES Role(id) 

); 



CREATE TABLE Category 
(
    id int(11)  NOT NULL , 
    name varchar(255) NULL, 
    PRIMARY KEY (id) 
); 


CREATE TABLE Joke 
(
    id int(11)  NOT NULL , 
    joketext text NULL , 
    jokedate date NOT NULL , 
    authorid int(11) NULL, 
    PRIMARY KEY (id), 
    FOREIGN KEY(authorid) REFERENCES Author(id) 

); 


CREATE TABLE JokeCategory 
(
    jokeid int(11)  NOT NULL , 
    categoryid int(11) NOT NULL , 
    PRIMARY KEY (jokeid, categoryid), 
    FOREIGN KEY(jokeid) REFERENCES Joke(id), 
    FOREIGN KEY(categoryid) REFERENCES Category(id) 


); 

Tworzenie tabeli roli, a potem AuthorRole.

+0

ten skrypt powinien działać jak urok ... Mam nadzieję, że to pomoże –

+0

Cześć, To działało idealnie! Dzięki stosy! – Fishingfon