MySQL 找出列上的外键约束

问题描述 投票:0回答:1

我正在尝试做:

 ALTER TABLE keycloak_prod.KEYCLOAK_ROLE CHANGE APP_REALM_CONSTRAINT CLIENT_REALM_CONSTRAINT VARCHAR(36)

但我明白:

SQL-Error [1846] [0A000]: ALTER TABLE is not supported. Reason: Altering name of a field being referenced from a foreign key is not supported. Try dropping foreign key first.

当尝试找出该列上的 FK 约束时:

SELECT 
  TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
  INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
  REFERENCED_TABLE_SCHEMA = (SELECT DATABASE()) AND
  REFERENCED_TABLE_NAME = 'KEYCLOAK_ROLE'

我只得到:

TABLE_NAME          |COLUMN_NAME|CONSTRAINT_NAME             |REFERENCED_TABLE_NAME|REFERENCED_COLUMN_NAME|
--------------------+-----------+----------------------------+---------------------+----------------------+
COMPOSITE_ROLE      |COMPOSITE  |FK_A63WVEKFTU8JO1PNJ81E7MCE2|KEYCLOAK_ROLE        |ID                    |
COMPOSITE_ROLE      |CHILD_ROLE |FK_GR7THLLB9LU8Q4VQA4524JJY8|KEYCLOAK_ROLE        |ID                    |
REALM_DEFAULT_ROLES |ROLE_ID    |FK_H4WPD7W4HSOOLNI3H0SW7BTJE|KEYCLOAK_ROLE        |ID                    |
SCOPE_MAPPING       |ROLE_ID    |FK_P3RH9GRKU11KQFRS4FLTT7RNQ|KEYCLOAK_ROLE        |ID                    |
CLIENT_DEFAULT_ROLES|ROLE_ID    |FK_8AELWNIBJI49AVXSRTUF6XJOW|KEYCLOAK_ROLE        |ID                    |

所以我尝试重命名的列不会出现在这里。

显示创建表:

Table        |Create Table                                                                                                                                                                                                                                                   |
-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
KEYCLOAK_ROLE|CREATE TABLE `KEYCLOAK_ROLE` (¶  `ID` varchar(36) NOT NULL,¶  `APP_REALM_CONSTRAINT` varchar(36) DEFAULT NULL,¶  `CLIENT_ROLE` bit(1) DEFAULT NULL,¶  `DESCRIPTION` varchar(255) DEFAULT NULL,¶  `NAME` varchar(255) DEFAULT NULL,¶  `REALM_ID` varchar(255) DE|

当我在 DBeaver 中为表生成 DDL 时,它向我显示:

-- keycloak_prod.KEYCLOAK_ROLE 定义

CREATE TABLE `KEYCLOAK_ROLE` (
  `ID` varchar(36) NOT NULL,
  `APP_REALM_CONSTRAINT` varchar(36) DEFAULT NULL,
  `CLIENT_ROLE` bit(1) DEFAULT NULL,
  `DESCRIPTION` varchar(255) DEFAULT NULL,
  `NAME` varchar(255) DEFAULT NULL,
  `REALM_ID` varchar(255) DEFAULT NULL,
  `CLIENT` varchar(36) DEFAULT NULL,
  `REALM` varchar(36) DEFAULT NULL,
  PRIMARY KEY (`ID`),
  UNIQUE KEY `UK_J3RWUVD56ONTGSUHOGM184WW2` (`NAME`,`APP_REALM_CONSTRAINT`),
  KEY `FK_6VYQFE4CN4WLQ8R6KT5VDSJ5C` (`REALM`),
  KEY `FK_PIMO5LE2C0RAL09FL8CM9WFW9` (`CLIENT`),
  CONSTRAINT `FK_6VYQFE4CN4WLQ8R6KT5VDSJ5C` FOREIGN KEY (`REALM`) REFERENCES `REALM` (`ID`)
) ENGINE=ndbcluster DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
mysql foreign-keys alter-table
1个回答
0
投票

您可以通过执行以下操作来实现此目的:

  1. 暂时删除外键约束。
  2. 暂时删除唯一约束。
  3. 重命名该列。
  4. 重新添加约束。

SQL 工作流程:

-- Drop the unique constraint temporarily
ALTER TABLE keycloak_prod.KEYCLOAK_ROLE DROP INDEX UK_J3RWUVD56ONTGSUHOGM184WW2;

-- Attempt to rename the column again
ALTER TABLE keycloak_prod.KEYCLOAK_ROLE CHANGE APP_REALM_CONSTRAINT CLIENT_REALM_CONSTRAINT VARCHAR(36);

-- Re-add the unique constraint with the new column name
ALTER TABLE keycloak_prod.KEYCLOAK_ROLE ADD UNIQUE UK_J3RWUVD56ONTGSUHOGM184WW2 (`NAME`, `CLIENT_REALM_CONSTRAINT`);
© www.soinside.com 2019 - 2024. All rights reserved.