SQL将外键添加到现有表

问题描述:

我已经开始阅读SQL,并且正在阅读Head First SQL书,并且正在使用MySQL。我有一个解释如何使用外键创建新表并将数据从单个表移动到新表的问题。没有提到的是如何在旧表中创建外键并为其分配fk数据。这些都是表:SQL将外键添加到现有表

my_contacts: 
FirstName 
LastName 
Profession 

电话

Profession: 
Prof_ID PK 
Profession 

所以我所做的就是增加一个额外的列称为Prof_ID的my_contacts与

UPDATE my_contacts SET prof_id = (
    SELECT prof_id FROM my_contacts WHERE my_contacts.profession = profession.profession 
); 

这工作完全匹配的填充它职业名称来自2个表格并填充my_contacts.prof_id。之后,我在该列上创建了约束和FK,并删除了my_contacts.profession。

我正在努力围绕我的头脑是如何运行语句。从我读过SQL过程的声明中,除非明确地告诉我们按照order by和group by来做别的事情。那么为什么这个陈述正确匹配?我正在努力理解它如何通过数据运行,与像C#这样的语言不同,我知道事件发生的顺序。这是否像循环语句?

感谢您的时间,并始终如一。

+0

UPDATE语句中是否有拼写错误?你的意思是'UPDATE my_contacts SET prof_id =( SELECT prof_id FROM''' *** profession ***'''WHERE my_contacts.profession = profession.profession);'''? – luksch

+0

是你的问题回答? – luksch

是的,它就像一个循环。由于UPDATE语句中没有WHERE子句,所以更新了my_contacts的所有行。您使用SELECT陈述来找到每行my_contacts的正确值。这有效,因为my_contacts.profession更改其每行my_contacts的值。

+0

感谢您的快速响应。我试图用本书的其他一些示例表来测试它。我在2个表中使用了一个select和一个内部连接,并且不管我加入表的顺序如何,结果都遵循这个表的顺序。不管它是左边还是右边。 – user3510945

+0

订单不相关,因为没有依赖它。您的UPDATE语句将产生与my_contacts中的行一样多的SELECT语句。 – luksch

+0

因此,UPDATE语句是什么具有“循环”功能?即ROW1 my_contacts.profession = profession.profession因此my_contacts.prof_ID = 1 ROW2 .....等。如果没有排序的SELECT语句只是吐出最快的东西? – user3510945