Przejąłem projekt, w którym podpisano identyczne wydanie niektórych kluczy podstawowych i podpisano również powiązane pole obce.
Użyłem podejścia @Devart, ale udało mi się zautomatyzować cały proces. Udało mi się przetestować information_schema
, aby wygenerować dodatkowe instrukcje SQL, które można "wyciąć i wkleić", a następnie uruchomić.
Generowanie SQL upuścić wszystkie ograniczenia
SELECT concat('ALTER TABLE ', TABLE_NAME, ' DROP FOREIGN KEY ', CONSTRAINT_NAME, ';')
FROM information_schema.key_column_usage
WHERE CONSTRAINT_SCHEMA = 'YOUR_SCHEMA_NAME'
AND referenced_table_name IS NOT NULL;
zmieniać żadnych id
kolumn, które muszą być zmienione na unsigned
SELECT
CONCAT('ALTER TABLE `', TABLE_NAME, '` CHANGE COLUMN id id INT UNSIGNED NOT NULL AUTO_INCREMENT;')
FROM `COLUMNS`
WHERE
`COLUMN_KEY` = 'PRI' AND
`TABLE_SCHEMA` = 'YOUR_SCHEMA_NAME' AND
`COLUMN_TYPE` NOT LIKE '%unsigned%' AND
`COLUMN_TYPE` LIKE '%int%' AND
`COLUMN_NAME` = 'id';
Alter pola zagraniczne kierujące do id
SELECT CONCAT('ALTER TABLE `', kcu.TABLE_NAME, '` CHANGE COLUMN ', kcu.COLUMN_NAME,' ', kcu.COLUMN_NAME, ' INT UNSIGNED ', IF(c.IS_NULLABLE = 'YES', 'NULL', 'NOT NULL'), ';')
FROM `KEY_COLUMN_USAGE` kcu
INNER JOIN `COLUMNS` c
ON
kcu.TABLE_NAME = c.TABLE_NAME AND
kcu.COLUMN_NAME = c.COLUMN_NAME
WHERE
`REFERENCED_COLUMN_NAME` = 'id' AND
`REFERENCED_TABLE_NAME` IN (
SELECT
TABLE_NAME
FROM `COLUMNS`
WHERE
`COLUMN_KEY` = 'PRI' AND
`TABLE_SCHEMA` = 'YOUR_SCHEmA_NAME' AND
`COLUMN_TYPE` NOT LIKE '%unsigned%' AND
`COLUMN_TYPE` LIKE '%int%' AND
`COLUMN_NAME` = 'id'
);
(Uwaga: w tym oświadczeniu, wszystkie są zmieniane być niepodpisany przez pomyłkę nawet jeśli są one już UNSIGNED ale nie powoduje to żadnych problemów)
ponownie włożyć wszystkie wymagane ograniczenia
SELECT CONCAT('ALTER TABLE ', rc.`TABLE_NAME` ,' ADD CONSTRAINT ', rc.`CONSTRAINT_NAME`, ' FOREIGN KEY (',kcu.`COLUMN_NAME`,') REFERENCES ', rc.`REFERENCED_TABLE_NAME` ,'(id) ON DELETE ', DELETE_RULE , ' ON UPDATE ' , UPDATE_RULE, ';')
FROM `REFERENTIAL_CONSTRAINTS` rc
INNER JOIN
`KEY_COLUMN_USAGE` kcu
ON rc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
WHERE kcu.CONSTRAINT_SCHEMA = 'api' AND
kcu.`REFERENCED_COLUMN_NAME` = 'id';
Zwracaj szczególną uwagę na te instrukcje SQL, może to wymagać modyfikacji dla twojego schematu, na przykład zakłada, że Twój podstawowy identyfikator nosi nazwę "id".
Należy również uruchomić wszystkie 4 z tych instrukcji, PRZED uruchomieniem dowolnego z ich rzeczywistych wyników.
Używanie MySQL 5.6
Dzięki. To działa, ale jest obowiązkiem. – Norwald2
Tak, jest. Możesz spróbować zmienić nazwę kolumny przy pomocy refaktoryzacji w [dbForge Studio for MySQL] (http://www.devart.com/dbforge/mysql/studio/); zrobi to automatycznie (w Eksploratorze bazy danych). – Devart
Użyłem tego podejścia i napisałem scenariusz całego procesu, zobacz odpowiedź https://stackoverflow.com/a/47169383/1241791 – Sam