我在 MySQL 5.1 盒子上为我的一个软件包提供了一个特定的表,我需要删除几百个条目。这些是名称大写的用户名,应用程序是特定于大小写的并且期望小写。但是,该表被大量其他表引用,其中一些表可能引用回这些用户。
是否有现成的方法来调整我的数据库中引用表“登录”中给定列“用户名”的所有表的外键以设置删除级联属性?我看不到这样做的现成方法。
我需要的是根据此表使用外键更改所有其他表以利用删除级联。我希望这样做而不需要手动更改一百个表。
我正在使用的选择是
delete from user where user_name REGEXP '^.*[A-Z].+$';
问题是应用程序在 user_id 字段中创建了重复的用户 ID。我只想保留正确创建的用户名的 ID 号。
上面的选择正是我想要摆脱的目标。我无权访问创建这些条目的应用程序源。
警告 !!!
在你做任何事情之前,mysqldump整个数据库或tarball /var/lib/mysql
如果您担心区分大小写,则需要以特殊方式查找用户名
我尝试了这个小实验
我加载了样本数据
我运行了这些查询(请注意细微差别)
给出我的实验的这个视图,一个全大写或混合大小写的用户名可以等于一个全小写除非你使用
BINARY
操作符进行比较我不认为
BINARY
可以应用到ON DELETE CASCADE
。但是,您可以这样做:要删除所有仅小写的用户名,请尝试运行以下操作之一:
或者
如果您现在运行它,您可能会取消其他表中的所有用户名。改为运行它
或者
您将必须转到其中包含用户名的所有表并执行
由于您有大量其他表,请使用 INFORMATION_SCHEMA 为您编写脚本:
如果文件对您来说是正确的,请像这样在 mysql 客户端中运行它
试试看 !!!
如果您确实必须创建新行,则必须对每个表的每个相关行运行 UPDATE 并将相关行上的外键设置为 logins 表中新行的 ID。
我不确定为什么有必要删除这些具有引用它们的数据的行。
为什么不?
我认为除了破坏数据之外还有其他选择。
如果万一此表的唯一用途是登录名并且用户名不是从属表中的 FK,则可以运行:
这将使内容符合应用程序,但保持 PK ID 不变