2016-05-03 5 views
0

Ich habe wie dieses Szenario verknüpft:ändern Primärschlüssel von BigInt zu Unsigned BigInt, wenn sie als Fremdschlüssel

CREATE TABLE `Users` (
    `IdUser` bigint(20) NOT NULL PRIMARY KEY 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE `MainTable` (
    `IdLite` bigint(20) NOT NULL PRIMARY KEY 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE `LinkedTable` (
    `IdUser` bigint(20) NOT NULL, 
    `IdLite` bigint(20) NOT NULL, 
PRIMARY KEY (`IdUser`, `IdLite`), 
FOREIGN KEY (`IdUser`) REFERENCES `Users` (`IdUser`), 
FOREIGN KEY (`IdLite`) REFERENCES `MainTable` (`IdLite`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

Ich versuche IdLite-Unsigned mit einer Abfrage wie folgt zu ändern:

SET FOREIGN_KEY_CHECKS=0; 
ALTER TABLE `MainTable` CHANGE `IdLite` 
    `IdLite` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT; 
ALTER TABLE `LinkedTable` CHANGE `IdLite` 
    `IdLite` BIGINT(20) UNSIGNED NOT NULL; 
SET FOREIGN_KEY_CHECKS=1; 

aber ich bekomme Fehler:

errno: 150 - Foreign key constraint is incorrectly formed

Wie kann ich lösen?

Antwort

2

Sie können den Datentyp von Spalten in einer vorhandenen FK-Integritätsbedingung nicht ändern.

Sie können die FK-Einschränkung fallen, ändern Sie die Spaltendatentypen und dann erstellen Sie die FK-Einschränkung:

ALTER TABLE LinkedTable 
    DROP FOREIGN KEY linkedtable_ibfk_2; -- or whatever the symbol is named 

ALTER TABLE MainTable 
    MODIFY IdLite SERIAL; -- alias of BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE 

ALTER TABLE LinkedTable 
    MODIFY IdLite BIGINT UNSIGNED NOT NULL, 
    ADD FOREIGN KEY (IdLite) REFERENCES MainTable (IdLite); 
+0

Vielen Dank für Ihre Antwort und mir ein anderes Schlüsselwort für den Unterricht (seriell). – genespos

Verwandte Themen