외국 키가 있는 경우에만 삭제
MySQL 데이터베이스에 있습니다.
이렇게 하고 있는데 안 돼요.
ALTER TABLE `object` DROP FOREIGN KEY IF EXISTS `object_ibfk_1`;
나는 내가 할 수 있는 모든 곳에 이것이 존재한다면 하려고 노력했습니다.외국인 키가 존재하는지를 확인한 후 드롭할 수 있는 방법은?
외부 키가 있는 경우 삭제하고 프로시저를 사용하지 않으려면 다음과 같은 방법으로 수행할 수 있습니다(MySQL의 경우).
set @var=if((SELECT true FROM information_schema.TABLE_CONSTRAINTS WHERE
CONSTRAINT_SCHEMA = DATABASE() AND
TABLE_NAME = 'table_name' AND
CONSTRAINT_NAME = 'fk_name' AND
CONSTRAINT_TYPE = 'FOREIGN KEY') = true,'ALTER TABLE table_name
drop foreign key fk_name','select 1');
prepare stmt from @var;
execute stmt;
deallocate prepare stmt;
외국 키가 있으면 변수에 변경 가능한 문을 넣고 없으면 더미 문을 넣습니다.그런 다음에 실행합니다.
재사용성을 높이려면 저장 프로시저를 사용하는 것이 좋습니다.원하는 DB에서 다음 코드를 한 번 실행합니다.
DROP PROCEDURE IF EXISTS PROC_DROP_FOREIGN_KEY;
DELIMITER $$
CREATE PROCEDURE PROC_DROP_FOREIGN_KEY(IN tableName VARCHAR(64), IN constraintName VARCHAR(64))
BEGIN
IF EXISTS(
SELECT * FROM information_schema.table_constraints
WHERE
table_schema = DATABASE() AND
table_name = tableName AND
constraint_name = constraintName AND
constraint_type = 'FOREIGN KEY')
THEN
SET @query = CONCAT('ALTER TABLE ', tableName, ' DROP FOREIGN KEY ', constraintName, ';');
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END$$
DELIMITER ;
그 후 언제든지 이 내용을 바꿀 수 있습니다.
ALTER TABLE `object` DROP FOREIGN KEY IF EXISTS `object_ibfk_1`;
이 경우:
CALL PROC_DROP_FOREIGN_KEY('object', 'object_ibfk_1');
그러면 스크립트가 원활하게 실행될 것입니다.object_ibfk_1
실제로 존재하든 그렇지 않든.
많은 공로: http://simpcode.blogspot.com.ng/2015/03/mysql-drop-foreign-key-if-exists.html
IF EXISTS(
SELECT *
FROM INFORMATION_SCHEMA.STATISTICS
WHERE INDEX_SCHEMA = DATABASE()
AND TABLE_NAME='myTable'
AND INDEX_NAME = 'myIndex')
THEN
ALTER TABLE `myTable` DROP FOREIGN KEY `myForeignKey`;
ALTER TABLE `myTable` DROP INDEX `myIndex` ;
END IF;
외부 키 제약 조건을 생성하면 참조된 열에 mysql이 인덱스를 자동으로 생성합니다.위의 예는 INFORMATION_SCHEMA에서 인덱스를 확인하는 방법을 보여주지만, 정보 스키마에서 확인할 수 있는 정보가 훨씬 더 많습니다.인덱스 이름이 FK용으로 생성되었음을 나타내는 것 같으니 FK를 먼저 삭제한 후 인덱스를 삭제해야 합니다.외부 키를 다시 생성하면 mysql에서 인덱스를 다시 생성합니다.테이블 스캔을 수행하지 않고도 참조 무결성을 적용할 수 있는 인덱스가 필요합니다.
동일한 열을 포함하는 새 인덱스를 만들려는 경우 먼저 해당 인덱스를 만들어야 합니다(이 열을 사용하면 FK로 사용되며 인덱스에 대해 지정된 열 목록에서 첫 번째가 됨).이제 FK를 다시 추가할 수 있고 mysql은 다른 인덱스를 만들지 않고 새로운 인덱스를 사용할 수 있습니다.
편집: 인덱스를 빠르게 보려면 단순히 SHOW INDES FROM myTable을 실행하기만 하면 됩니다.
Mariadb 10.1.26(새로운 Mysql)의 최신 버전에서는 다음과 같이 쿼리가 작동합니다.
키:MUL
ALTER TABLE `object` DROP FOREIGN KEY IF EXISTS `object_ibfk_1`;
DESC `object`;
키:<NULL>
사용 중인 데이터베이스는 무엇입니까?
SQL 서버인 경우
if exists (select 1 from sys.objects where object_id = OBJECT_ID(N'[FKName]') AND
parent_object_id = OBJECT_ID('TableName'))
alter table TableName drop constraint FKName
여기에 다음과 같은 해결 방법이 있습니다.DROP FOREIGN KEY IF EXISTS
, 이전 MySQL 버전과 MariaDB 버전에는 없습니다.v10.1.4
. 당신은 또한 당신이 원하는 모든 다른 진술에 그것을 사용할 수 있습니다, 그것은 그것의 존재에 달려 있어야 합니다.FOREIGN KEY
(예를 들어 을 위해)SELECT "info: foreign key exists."
아래의 예와 같이).
-- DROP FOREIGN KEY IF EXISTS
SELECT
COUNT(*)
INTO
@FOREIGN_KEY_my_foreign_key_ON_TABLE_my_table_EXISTS
FROM
`information_schema`.`table_constraints`
WHERE
`table_schema` = 'my_database'
AND `table_name` = 'my_table'
AND `constraint_name` = 'my_foreign_key'
AND `constraint_type` = 'FOREIGN KEY'
;
-- SELECT @FOREIGN_KEY_my_foreign_key_ON_TABLE_my_table_EXISTS;
SET @statement := IF(
@FOREIGN_KEY_my_foreign_key_ON_TABLE_my_table_EXISTS > 0,
-- 'SELECT "info: foreign key exists."',
'ALTER TABLE my_table DROP FOREIGN KEY my_foreign_key',
'SELECT "info: foreign key does not exist."'
);
PREPARE statement FROM @statement;
EXECUTE statement;
비슷한 논의:sql 서버에 있는 경우에만 외부 키 제약 조건을 삭제하려면 어떻게 해야 합니까?
IF (OBJECT_ID('FK_ConstraintName', 'F') IS NOT NULL)
매우 유용하고 아직 여기서 언급되지 않았습니다.
언급URL : https://stackoverflow.com/questions/17161496/drop-foreign-key-only-if-it-exists
'programing' 카테고리의 다른 글
bin 로그 디렉터리를 변경하려고 합니다. mysql-bin.index를 찾을 수 없습니다(Errcode: 13). (0) | 2023.10.17 |
---|---|
Jquery AJAX를 사용하여 MVC Action을 호출한 후 MVC에서 양식을 제출하는 방법은 무엇입니까? (0) | 2023.10.17 |
파일 이름을 저장하기 전에 불법 문자를 제거하는 방법? (0) | 2023.10.17 |
WooCommerce에서 정가전 판매가격 표시 (0) | 2023.10.17 |
동일하지 않은 값에 대한 mysql 구문 (0) | 2023.10.12 |