Ich übernahm ein Projekt, das ein identisches Problem einiger Primärschlüssel signiert hatte, und das zugehörige Fremdfeld wurde ebenfalls signiert.
Ich verwendete @Devart Ansatz, aber ich war in der Lage, den gesamten Prozess zu automatisieren. Ich konnte die information_schema
abfragen, um zusätzliche SQL-Anweisungen zu generieren, die ich "ausschneiden und einfügen" und dann später ausführen konnte.
Generieren von SQL-Anweisungen alle Einschränkungen
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;
Alter alle id
Spalten zu löschen, die zu 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 ausländische Felder zum id
Hinweis geändert werden müssen,
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'
);
(Hinweis in dieser Erklärung werden alle geändert versehentlich ohne Vorzeichen werden auch wenn sie schon nicht signiert sind, aber dies verursacht keine Probleme)
Reinsert alle erforderlichen Einschränkungen
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';
Achten Sie genau auf diese SQL-Anweisungen. Sie müssen möglicherweise für Ihr Schema geändert werden, z. B. wird davon ausgegangen, dass Ihre primäre ID "id" heißt.
Sie müssen auch alle 4 dieser Anweisungen ausführen, bevor Sie eine ihrer tatsächlichen Ausgaben ausführen.
Verwenden von MySQL 5.6
Danke. Das funktioniert, ist aber lästig. – Norwald2
Ja, ist es. Sie können die Spaltenumbenennung mit Refactoring in [dbForge Studio für MySQL] versuchen (http://www.devart.com/dbforge/mysql/studio/); Es wird automatisch ausgeführt (im Datenbank-Explorer). – Devart
Ich habe diesen Ansatz und Skript den gesamten Prozess, siehe Antwort https://stackoverflow.com/a/47169383/1241791 – Sam