我正在尝试做:
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;
您可以通过执行以下操作来实现此目的:
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`);