mySQL重复外键

时间:2016-01-01 22:10:43

标签: mysql sql database-design

我是MySQL的初学者,我正在尝试建立一个供个人使用的数据库。 我试图给多个'Werknemer'提供相同的'Jobfunctie'。

例如: 船员(werknemer)(0100)是'arbeider'。 第二名船员(werknemer)(0101)也是'arbeider'。

CREATE TABLE Werknemer (
    personeelsnummer int(4) not NULL,
    voornaam varchar(10) not NULL,
    achternaam varchar(10) not NULL,
    adres varchar(30) not NULL,
    telefoon varchar(10) not NULL,
    winkelnummer int(4) not NULL,
    primary key(personeelsnummer),
    foreign key(winkelnummer) references Winkel(winkelnummer)

CREATE TABLE Jobfunctie (
    jobfunctie varchar(15) not NULL,
    salaris_in_euro int(10) not NULL,
    personeelsnummer int(4) not NULL,
    foreign key(personeelsnummer) references Werknemer(personeelsnummer),
    primary key(jobfunctie)
);

INSERT INTO Werknemer values
(0100, 'firstname', 'lastname', 'adress', 'telephone', 0001);
INSERT INTO Werknemer values
(0101, 'firstname2', 'lastname2', 'adress', 'telephone', 0002);

INSERT INTO Jobfunctie values
('Arbeider', 1500, 0100);
INSERT INTO Jobfunctie values
('Arbeider', 1500, 0101);

这意味着'Arbeider'显示两次主键,这是不可能的。如何为同一个工作分配多个人?

2 个答案:

答案 0 :(得分:2)

针对这些情况的教科书解决方案是使用联结或映射表。 Werknemer应该包含有关船员的信息,Jobfunctie关于工作描述,你需要第三张表来指派船员工作:

CREATE TABLE Werknemer (
    personeelsnummer INT(4) NOT NULL,
    voornaam VARCHAR(10) NOT NULL,
    achternaam VARCHAR(10) NOT NULL,
    adres VARCHAR(30) NOT NULL,
    telefoon VARCHAR(10) NOT NULL,
    PRIMARY KEY (personeelsnummer)
);

CREATE TABLE Jobfunctie (
    jobnumber INT(4) NOT NULL
    jobfunctie VARCHAR(15) NOT NULL,
    salaris_in_euro INT(10) NOT NULL,
    PRIMARY KEY (jobnumber)
);

-- The new junction table
CREATE TABLE Werknemer_Jobfunctie (
    personeelsnummer INT(4) NOT NULL,
    jobnumber INT(4) NOT NULL,
    PRIMARY KEY (personeelsnummer, jobnumber),
    FOREIGN KEY (personeelsnummer) references Werknemer (personeelsnummer),
    FOREIGN KEY (jobnumber) references Jobfunctie (jobnumber),
)

-- Insert crewmen
INSERT INTO Werknemer VALUES
(0100, 'firstname', 'lastname', 'adress', 'telephone');
INSERT INTO Werknemer VALUES
(0101, 'firstname2', 'lastname2', 'adress', 'telephone');

-- Insert a job description
INSERT INTO Jobfunctie VALUES
(1, 'Arbeider', 1500);

-- Assign this job to both crewmen
INSERT INTO Werknemer_Jobfunctie VALUES
(0100, 1);
INSERT INTO Werknemer_Jobfunctie VALUES
(0101, 1);

答案 1 :(得分:1)

更改您的Jobfunctie表格如下:

CREATE TABLE Jobfunctie (
 jobfunctienummer int(4) not NULL,
 jobfunctie varchar(15) not NULL,
 salaris_in_euro int(10) not NULL,
 personeelsnummer int(4) not NULL,
 foreign key(personeelsnummer) references Werknemer(personeelsnummer),
 primary key(jobfunctienummer)
);

并使用这样的插入:

INSERT INTO Jobfunctie values
('1', 'Arbeider', 1500, 0100);
INSERT INTO Jobfunctie values
('2', 'Arbeider', 1500, 0101);