2016-10-28 4 views
3

일반적으로 외래 키를 삭제하고 다시 생성하여 테이블의 업데이트 및 삭제 규칙을 변경합니다. 예 :MySQL에서 테이블 집합의 업데이트 및 삭제 규칙 만 변경하십시오.

ALTER TABLE xyz DROP FOREIGN KEY fk_1;

ALTER TABLE xyz ADD CONSTRAINT fk_1 FOREIGN KEY (a) REFERENCES batch_details a) ON DELETE CASCADE ON UPDATE CASCADE;

하지만이 지루하게 같은 다음 일을 테이블 세트가있는 경우. 나는 업데이트를보고 나는 또한 시도

select * from information_schema.referential_constraints;

를 사용하는 모든 테이블에 대한 규칙을 삭제할 수 있지만 :

update information_schema.referential_constraints set update_rule='CASCADE',delete_rule='CASCADE' where table_name='x';

을하지만 내가 줄 수없는 루트 권한을 원한다. 도와주세요. 루프 중 외부 절차에서, 또는 스크립트에서 - 사전에

덕분에

+0

서버에 대한 권한이 있습니까? 어쩌면이 테이블을 업데이트 할 수있는 권한이 없거나 테이블 구조를 전혀 업데이트 할 권한이 없다는 것입니다. – rbr94

+1

예 위의 기본 alter 명령을 사용하여 업데이트 할 수 있습니다. – Sanghita

+0

'information_schema.referential_constraints'를 업데이트하려고합니다. – rbr94

답변

0

나의 추천 당신이 그런 절차를 한 후, 이러한 작업을 수행 전화를 다시 사용할 수있는 관리 저장 프로 시저의 집합을 만드는 것입니다 .

예를 들어 원래 information_schemaSELECT 쿼리의 결과를 반복 할 수 있으며 (아마도 프로 시저의 커서를 사용하여) 반환 된 각 행에 대해 새 관리 절차를 호출 할 수 있습니다.

다음은 외래 키를 삭제하는 데 사용할 수있는 관리 저장 프로 시저입니다. 동일한 원칙을 사용하여 제약 조건을 추가하는 비슷한 절차를 만들 수 있습니다.

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 ;