Yabancı anahtara sahip bir sütun içeren bir tablo oluşturdum, şu şekilde ayarlandı ON DELETE CASCADE(ebeveyn silindiğinde çocuğu sil)
Bunu değiştirmek için SQL komutu ne olurdu ON DELETE RESTRICT? (çocukları varsa ebeveyn silinemez)
Yanıtlar:
Eski soru ama yardım alabilmek için cevap ekleniyor
İki aşamalı süreci:
Diyelim ki, a'nın sütun adında , kısıtlama adında table1bir yabancı anahtara sahip olduğunu ve anahtarlı tablo olarak adlandırıldığını varsayalım ( şemamda aşağıdaki gibi ). fk_table2_idfk_nametable2t2
table1 [ fk_table2_id ] --> table2 [t2]
İlk adım , eski KISITLIĞI BIRAKIN: ( referans )
ALTER TABLE `table1`
DROP FOREIGN KEY `fk_name`;
uyarı kısıtlaması silindi, sütun silinmedi
İkinci adım , yeni KISITLAMA EKLE:
ALTER TABLE `table1`
ADD CONSTRAINT `fk_name`
FOREIGN KEY (`fk_table2_id`) REFERENCES `table2` (`t2`) ON DELETE CASCADE;
kısıtlama ekliyor, sütun zaten var
Misal:
UserDetailsTabloda bir tablo var Users:
mysql> SHOW CREATE TABLE UserDetails;
:
:
`User_id` int(11) DEFAULT NULL,
PRIMARY KEY (`Detail_id`),
KEY `FK_User_id` (`User_id`),
CONSTRAINT `FK_User_id` FOREIGN KEY (`User_id`) REFERENCES `Users` (`User_id`)
:
:
İlk adım:
mysql> ALTER TABLE `UserDetails` DROP FOREIGN KEY `FK_User_id`;
Query OK, 1 row affected (0.07 sec)
İkinci adım:
mysql> ALTER TABLE `UserDetails` ADD CONSTRAINT `FK_User_id`
-> FOREIGN KEY (`User_id`) REFERENCES `Users` (`User_id`) ON DELETE CASCADE;
Query OK, 1 row affected (0.02 sec)
sonuç:
mysql> SHOW CREATE TABLE UserDetails;
:
:
`User_id` int(11) DEFAULT NULL,
PRIMARY KEY (`Detail_id`),
KEY `FK_User_id` (`User_id`),
CONSTRAINT `FK_User_id` FOREIGN KEY (`User_id`) REFERENCES
`Users` (`User_id`) ON DELETE CASCADE
:
Adını değiştirmek istiyorsanız , bunu tek bir sorguda yapabilirsiniz :
ALTER TABLE table_name
DROP FOREIGN KEY `fk_name`,
ADD CONSTRAINT `fk_name2` FOREIGN KEY (`remote_id`)
REFERENCES `other_table` (`id`)
ON DELETE CASCADE;
Bu, büyük bir masanız varsa kesinti süresini en aza indirmek için kullanışlıdır.
ALTER TABLE DROP FOREIGN KEY fk_name;
ALTER TABLE ADD FOREIGN KEY fk_name(fk_cols)
REFERENCES tbl_name(pk_names) ON DELETE RESTRICT;
ALTER TABLE table_name ADD...ON DELETE RESTRICT
SHOW CREATE TABLE.
MySQL'in yabancı anahtarı sildikten sonra bir sütunda basit bir indeks tuttuğunu unutmayın. Dolayısıyla, 'referanslar' sütununu değiştirmeniz gerekiyorsa, bunu 3 adımda yapmalısınız.
drop indexcümle kullanarak )Hepsini yönetmek için tek bir sorgu kullanabilirsiniz:
ALTER TABLE products
DROP FOREIGN KEY oldConstraintName,
ADD FOREIGN KEY (product_id, category_id) REFERENCES externalTableName (foreign_key_name, another_one_makes_composite_key) ON DELETE CASCADE ON UPDATE CASCADE
Değiştirmem gereken bir sürü FK vardı, bu yüzden açıklamaları benim için yapacak bir şeyler yazdım. Paylaşacağımı düşündüm:
SELECT
CONCAT('ALTER TABLE `' ,rc.TABLE_NAME,
'` DROP FOREIGN KEY `' ,rc.CONSTRAINT_NAME,'`;')
, CONCAT('ALTER TABLE `' ,rc.TABLE_NAME,
'` ADD CONSTRAINT `' ,rc.CONSTRAINT_NAME ,'` FOREIGN KEY (`',kcu.COLUMN_NAME,
'`) REFERENCES `',kcu.REFERENCED_TABLE_NAME,'` (`',kcu.REFERENCED_COLUMN_NAME,'`) ON DELETE CASCADE;')
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
LEFT OUTER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
ON kcu.TABLE_SCHEMA = rc.CONSTRAINT_SCHEMA
AND kcu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME
WHERE DELETE_RULE = 'NO ACTION'
AND rc.CONSTRAINT_SCHEMA = 'foo'