mysql - 对于这个(不允许的)带有嵌套 SELECT 的 UPDATE,是否有替代方法?

标签 mysql

我有一个现有的联系人表,其中包含大约 14 万条记录。我正在引入一个父表(我们称它们为“parent_contacts”),这样一个 parent_contact 可以有多个联系人;但最初,parent_contacts 将被播种为数据库中当前存在的每个联系人都有一条记录。

我认为我尝试像下面这样的事情很聪明,我现在明白这是不允许的(假设所有必要的 parent_contact 记录都已提前创建):

UPDATE contacts
SET contacts.parent_id = 
  (SELECT parent_contacts.id FROM parent_contacts
   WHERE NOT EXISTS
     (SELECT * FROM contacts AS c WHERE c.parent_id = parent_contacts.id) LIMIT 1)

(如果不是很明显,这里的想法是将每个联系人的 parent_id 设置为另一个联系人尚未链接到的第一个 parent_contact 的 ID)

由于这种特殊方法是不可能的,是否有另一种不涉及执行 140k 单独更新语句的方法?

跟进:我通过在父表上引入一个临时的 child_id 来解决这个问题,然后在播种完成后将其删除。但在原始问题的上下文中,我认为 Tony 下面的回答听起来很恰当。

最佳答案

你好像倒过来了

将 Parent_id 添加到联系人(还没有限制!) 更新 Contacts 用唯一编号填充 Parent_id。 创建 ParentContracts,不要将 Identity 或主键放入。

回填 ParentContacts 并插入到 ParentContacts Select Parent_id, .... From Contacts

将身份(不要忘记下一个值的种子)和主键添加到 ParentContacts 将外键约束添加到联系人。

非常简单的步骤,并且很容易检查每一个,而不是你现在正在尝试的整个布料操作。

关于mysql - 对于这个(不允许的)带有嵌套 SELECT 的 UPDATE,是否有替代方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10144913/

相关文章:

java - 使用线程自动更新Listview

mysql - 计算特定月份的条目

php - 根据 AJAX 响应更改下拉值

php - 违反完整性约束 : 1052

MySQL 十六进制到签名字符

c# - 获取 Datagrid WPF 列上的选定项目并通过 Linq 查找它

使用 PDO 更新 MySQL 行时 PHP 错误

phpMyAdmin 中的 MySQL 循环

java - DAO 接口(interface)、类和工厂

mysql - 我怎样才能得到一行以及所有相关行的数量?