【问题标题】:SQL Add foreign key to existing tableSQL将外键添加到现有表
【发布时间】:2015-07-12 15:52:22
【问题描述】:

我已经开始阅读 SQL,目前正在阅读 Head First SQL 书,我正在使用 MySQL。我已经到了解释如何使用外键创建新表并将数据从单个表移动到新表的地步。没有提到的是如何在旧表中创建外键并为其分配fk数据。这些是表格:

my_contacts:
FirstName
LastName
Profession

电话

Profession:
Prof_ID PK
Profession

所以我所做的就是在 my_contacts 中添加一个名为 Prof_ID 的附加列,并用

填充它
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# 这样的语言不同,我知道事件发生的顺序。这像循环语句吗?

感谢您的宝贵时间。

【问题讨论】:

  • UPDATE语句有错别字吗?你是说UPDATE my_contacts SET prof_id = ( SELECT prof_id FROM职业WHERE my_contacts.profession = profession.profession);吗?
  • 你的问题得到解答了吗?

标签: mysql database key


【解决方案1】:

是的,它就像一个循环。 my_contacts 的所有行都会更新,因为在 UPDATE 语句中没有 WHERE 子句。您使用SELECT 语句来查找my_contacts 每一行的正确值。这是可行的,因为my_contacts.profession 会为my_contacts 的每一行更改其值。

【讨论】:

  • 感谢您的快速回复。我试图用本书中的其他一些示例表来测试这一点。我在 2 个表上使用了一个选择和一个内部连接,无论我加入表的顺序如何,结果都遵循一个表的顺序。不管是左边还是右边。
  • 顺序无关紧要,因为没有任何东西依赖它。您的 UPDATE 语句将生成与 my_contacts 中的行数一样多的 SELECT 语句。
  • 那么UPDATE语句有什么“循环”功能呢?即 ROW1 my_contacts.profession = professional.profession 因此 my_contacts.prof_ID = 1 ROW2 .....等等。没有排序的 SELECT 语句会吐出什么是最快的?
猜你喜欢
  • 2012-05-10
  • 2012-04-19
  • 2014-02-20
  • 2013-07-13
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多