数据在mysql查询上相乘

时间:2019-03-02 00:52:00

标签: mysql database foreign-keys relational-database primary-key

我有这张桌子:

CREATE TABLE Employee(
    id_employee INT PRIMARY KEY,
    Name VARCHAR(20),
    Last_name VARCHAR(20),
    Gender VARCHAR(1),
    Area INT     

 );

创建一个新表:

CREATE TABLE Area(
    id_area INT PRIMARY KEY,
    Area_name VARCHAR(20)
);

我希望Employee中的Area列转换为表Area中的id_area列的外键,所以我更改了表。

ALTER TABLE Employee
ADD FOREIGN KEY(Area)
REFERENCES Area(id_area)
ON DELETE SET NULL;

当我在employee表上使用DESC似乎没问题时,Area列现在为MUL。

现在,我在表Area中输入数据:

INSERT INTO Area VALUES(1, 'Grphic Design');
INSERT INTO Area VALUES(2, '3D Design');
INSERT INTO Area VALUES (3,'Software');
INSERT INTO Area VALUES(4, 'Administration');

现在我在Employee中输入我的第一个值:

INSERT INTO Empleados VALUES (109,'Charles', 
'Cook','M',1);

最后,如果列相关,我将使用此查询查看表的运行方式:

SELECT Name, Employee.Area, Area.id_area
FROM Employee, Area;

我得到了这个结果:

Name    | Area | id_area
Charles |   1  |    1
Charles |   1  |    2
Charles |   1  |    3
Charles |   1  |    4

好的,我做错了什么,为什么我的代码是垃圾箱?考虑到该查询,所有结果都不应该是Charles 1,id_area 1吗?只有一个结果?每次我有四个,如果我添加另一个人,此查询的结果将添加另一个1234废话。

1 个答案:

答案 0 :(得分:0)

您的问题出在查询的隐式JOIN

SELECT Name, Employee.Area, Area.id_area
FROM Employee, Area;

,等效于INNER JOIN,并且由于您对JOIN没有任何条件,因此它变成了CROSS JOIN,连接了{{1}的每一行}到Employee的每一行。即使AreaEmployee.Area的外键,它也不会强制将表联接到该键上,但您需要将其显式指定为Area.id_area条件:

JOIN