나의 추천 당신이 그런 절차를 한 후, 이러한 작업을 수행 전화를 다시 사용할 수있는 관리 저장 프로 시저의 집합을 만드는 것입니다 .
예를 들어 원래 information_schema
SELECT
쿼리의 결과를 반복 할 수 있으며 (아마도 프로 시저의 커서를 사용하여) 반환 된 각 행에 대해 새 관리 절차를 호출 할 수 있습니다.
다음은 외래 키를 삭제하는 데 사용할 수있는 관리 저장 프로 시저입니다. 동일한 원칙을 사용하여 제약 조건을 추가하는 비슷한 절차를 만들 수 있습니다.
DROP PROCEDURE IF EXISTS `admin_drop_fk`;
DELIMITER $$
CREATE PROCEDURE `admin_drop_fk`(
fk_name VARCHAR(64),
table_name VARCHAR(64),
db_name VARCHAR(64)
)
BEGIN
SET @sqlexec :=
CONCAT
(
'SELECT @i := COUNT(*) FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE CONSTRAINT_NAME = \'',
fk_name,
'\' AND TABLE_NAME = \'',
table_name,
'\' AND TABLE_SCHEMA = \'',
db_name,
'\''
);
SELECT CONCAT('Executing: "', @sqlexec, '"') AS 'Info';
PREPARE lookup FROM @sqlexec;
EXECUTE lookup;
DEALLOCATE PREPARE lookup;
IF @i > 0 THEN
SET @sqlexec := CONCAT('ALTER TABLE `', db_name, '`.`', table_name, '` DROP FOREIGN KEY `', fk_name, '`');
SELECT CONCAT('Executing: "', @sqlexec, '"') AS 'Info';
PREPARE statement FROM @sqlexec;
EXECUTE statement;
DEALLOCATE PREPARE statement;
SELECT CONCAT('Successful execution of: "', @sqlexec, '"') AS 'Info';
ELSE
SELECT CONCAT('Warning: Foreign key `', fk_name, '` does not exist on `', db_name, '`.`', table_name, '`') AS 'Warning';
END IF;
END$$
DELIMITER ;
서버에 대한 권한이 있습니까? 어쩌면이 테이블을 업데이트 할 수있는 권한이 없거나 테이블 구조를 전혀 업데이트 할 권한이 없다는 것입니다. – rbr94
예 위의 기본 alter 명령을 사용하여 업데이트 할 수 있습니다. – Sanghita
'information_schema.referential_constraints'를 업데이트하려고합니다. – rbr94