जवाबों:
पुराना सवाल है लेकिन जवाब जोड़ रहे हैं ताकि किसी को मदद मिल सके
इसकी दो चरण प्रक्रिया:
मान लीजिए, स्तंभ नाम के साथ table1
एक विदेशी कुंजी हैfk_table2_id
, बाधा नाम के साथ है fk_name
और table2
इसे कुंजी t2
( मेरे आरेख में नीचे की तरह कुछ ) के साथ तालिका में संदर्भित किया गया है ।
table1 [ fk_table2_id ] --> table2 [t2]
पहला कदम , पुराना विरोध: ( संदर्भ )
ALTER TABLE `table1`
DROP FOREIGN KEY `fk_name`;
सूचना बाधा हटा दी गई है, स्तंभ हटाया नहीं गया है
दूसरा चरण , नए अनुबंध जोड़ें:
ALTER TABLE `table1`
ADD CONSTRAINT `fk_name`
FOREIGN KEY (`fk_table2_id`) REFERENCES `table2` (`t2`) ON DELETE CASCADE;
बाधा जोड़ने, स्तंभ पहले से ही है
उदाहरण:
मेरे पास एक UserDetails
टेबल है टेबल को संदर्भित करता है 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`)
:
:
पहला कदम:
mysql> ALTER TABLE `UserDetails` DROP FOREIGN KEY `FK_User_id`;
Query OK, 1 row affected (0.07 sec)
दूसरा कदम:
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)
परिणाम:
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
:
यदि आप इसका नाम बदलना चाहते हैं तो आप इसे एक क्वेरी में कर सकते हैं :
ALTER TABLE table_name
DROP FOREIGN KEY `fk_name`,
ADD CONSTRAINT `fk_name2` FOREIGN KEY (`remote_id`)
REFERENCES `other_table` (`id`)
ON DELETE CASCADE;
यदि आपके पास एक बड़ी तालिका है, तो डाउनटाइम को कम करने के लिए यह उपयोगी है।
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
।
आप बस उन सभी पर शासन करने के लिए एक क्वेरी का उपयोग कर सकते हैं:
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
मेरे पास फेरबदल करने के लिए एफके का एक गुच्छा था, इसलिए मैंने मेरे लिए बयान करने के लिए कुछ लिखा। मुझे लगा कि मैं साझा करूंगा:
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'