使用MySQL在EXISTS条件下更改表 上下文
我有一个旧数据库,其关系基于字符串(人名),而不是id。例如,一个使用MySQL在EXISTS条件下更改表 上下文,mysql,Mysql,我有一个旧数据库,其关系基于字符串(人名),而不是id。例如,一个人名有许多注释通过注释表上的人名列连接 我想通过将列person\u name更改为person\u id来解决这个问题 建立新的关系 它包括在comments上创建新的person\u id列,并更新值: UPDATE comments SET person_id = (SELECT id FROM people WHERE LOWER(person_name) = name); 删除旧列 我不能直接删除人名并更新外
人名
有许多注释
通过注释
表上的人名
列连接
我想通过将列person\u name
更改为person\u id
来解决这个问题
建立新的关系
它包括在comments
上创建新的person\u id
列,并更新值:
UPDATE comments SET
person_id = (SELECT id FROM people WHERE LOWER(person_name) = name);
删除旧列
我不能直接删除人名
并更新外键。我需要确保所有评论都与作者有适当的链接。通过简单地选择所有具有person\u name
但具有空person\u id
的注释,我可以发出红旗,因为此迁移将自动应用于许多表
SELECT 1 FROM comments WHERE person_id IS NULL AND person_name IS NOT NULL
请注意,有些注释是匿名的,因此人名
可以是NULL
迁移
要做到这一点,我可以做到:
IF EXISTS(SELECT 1 FROM comments WHERE person_id IS NULL AND person_name IS NOT NULL)
THEN
ALTER TABLE comments
DROP COLUMN person_name;
END IF;
不幸的是,这似乎只适用于MSSQL,而不适用于MySQL
我可以使用什么替代方法?您正在尝试在MySQL上执行SQL Server(MSSQL)语法。。MySQL不支持普通查询中的flowcontrol,您可以将其重写为MySQL支持flowcontrol的存储过程。我删除了我的答案,因为有注释“在您的交易中,您没有条件。如何确保从更新中选择的内容与行匹配?。您可以有一个旧的\u id not null和一个新的\u id null。" .. 换言之,
ALTER。。。DROP…
仅当新\u id为空且旧\u id不为空时才会发生。
对于整个表为真?。。。。你的问题真的不太清楚。。我建议您提供示例数据和预期结果。为了提供阅读@RaymondNijland的建议,我对我的问题进行了更具体的编辑。您正在尝试在MySQL上执行SQL Server(MSSQL)语法。。MySQL不支持普通查询中的flowcontrol,您可以将其重写为MySQL支持flowcontrol的存储过程。我删除了我的答案,因为有注释“在您的交易中,您没有条件。如何确保从更新中选择的内容与行匹配?。您可以有一个旧的\u id not null和一个新的\u id null。" .. 换言之,ALTER。。。DROP…
仅当新\u id为空且旧\u id不为空时才会发生。
对于整个表为真?。。。。你的问题真的不太清楚。。我建议您提供示例数据和预期结果。为了给我提供阅读@RaymondNijland的建议,我将我的问题编辑得更具体一些。