如何批量为所有表中名称含KEY关键字的字段设置主键约束
该需求完全可以实现。原生SQL语法不支持你示例中带通配符的ALTER语句,核心实现思路是通过查询数据库自带的**信息模式(INFORMATION_SCHEMA)**系统表,批量匹配表名、含「KEY」的字段名、已存在的主键约束,自动生成对应的ALTER语句后批量执行即可,不需要手动逐张表操作。
前置注意事项
- 操作前必须全量备份数据库,避免误操作导致数据丢失
- 若单表存在多个包含「KEY」的字段,脚本默认取第一个匹配字段作为主键,如有联合主键需求可自行调整匹配逻辑
- 以下示例默认匹配字段名中含
KEY(可按需调整大小写、匹配规则)的字段作为主键
MySQL 实现示例
步骤1:生成删除所有已有主键的SQL语句
SELECT CONCAT('ALTER TABLE `', TABLE_SCHEMA, '`.`', TABLE_NAME, '` DROP PRIMARY KEY;') AS drop_pk_sql FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE CONSTRAINT_NAME = 'PRIMARY' AND TABLE_SCHEMA = '替换为你的数据库名';
运行上述查询后,复制输出的所有drop_pk_sql结果批量执行,即可删除所有表的原有主键。
步骤2:生成添加主键的SQL语句
SELECT CONCAT('ALTER TABLE `', c.TABLE_SCHEMA, '`.`', c.TABLE_NAME, '` ADD PRIMARY KEY (`', c.COLUMN_NAME, '`);') AS add_pk_sql FROM INFORMATION_SCHEMA.COLUMNS c WHERE c.TABLE_SCHEMA = '替换为你的数据库名' AND c.COLUMN_NAME LIKE '%KEY%';
运行上述查询后,校验输出的add_pk_sql符合预期后批量执行,即可为所有表的含KEY字段添加主键约束。
PostgreSQL 实现示例
步骤1:生成删除所有已有主键的SQL语句
SELECT CONCAT('ALTER TABLE "', table_schema, '"."', table_name, '" DROP CONSTRAINT "', constraint_name, '";') AS drop_pk_sql FROM information_schema.table_constraints WHERE constraint_type = 'PRIMARY KEY' AND table_schema = '替换为你的模式名';
步骤2:生成添加主键的SQL语句
SELECT CONCAT('ALTER TABLE "', c.table_schema, '"."', c.table_name, '" ADD PRIMARY KEY ("', c.column_name, '");') AS add_pk_sql FROM information_schema.columns c WHERE c.table_schema = '替换为你的模式名' AND c.column_name ILIKE '%KEY%';
额外说明
- 执行ALTER语句前务必先单独运行查询语句,校验生成的SQL是否符合预期,确认无误后再执行
- 如果匹配到的字段不满足主键要求(存在空值、重复值),执行添加主键时会报错,需先清理对应表的异常数据
- SQL Server等其他数据库的实现逻辑完全一致,仅需要调整信息模式表的查询字段即可
内容的提问来源于stack exchange,提问作者Kevin P.
相关产品推荐
相关产品推荐

