我有一个现有的联系人表,其中包含大约 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/