我有这张桌子:
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废话。
答案 0 :(得分:0)
您的问题出在查询的隐式JOIN
中
SELECT Name, Employee.Area, Area.id_area
FROM Employee, Area;
,
等效于INNER JOIN
,并且由于您对JOIN
没有任何条件,因此它变成了CROSS JOIN
,连接了{{1}的每一行}到Employee
的每一行。即使Area
是Employee.Area
的外键,它也不会强制将表联接到该键上,但您需要将其显式指定为Area.id_area
条件:
JOIN