13

外部キーを使用するMySQLInnoDBデータベースで、主キーの一部を、必要に応じて署名されていないのではなく、誤って署名してしまいました。

ここで、ALTER TABLEステートメントを使用して変更したいのですが、機能しません。

ALTER TABLE `users` CHANGE `id` `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT

MySQLエラー:

Error on rename of './db_dev/#sql-478_3' to './db_dev/users' (errno: 150)

理由がわかりません。私は外部キーを使用していて、

SET foreign_key_checks = 0;

上からALTERTABLEを実行する前のステートメント。どちらも動作しません。注意:私のテーブルはすべてまだ空です。まだデータがありません。

データベースには多くのテーブルがあるため、すべての外部キーを削除してから手動で再度追加するのは大変な作業になります。(これが理由である場合)。

4

6 に答える 6

10

このフィールドは外部キーで使用されます。MySQLでこのフィールドを変更するには、次の手順を実行する必要があります。

  • 関連するすべての外部キーを削除します
  • フィールドを変更
  • ドロップされたすべての外部キーを再作成します
于 2012-05-31T12:28:15.503 に答える
6

mysqlコマンドmysqldumpを使用してデータベースのダンプを取得し、必要に応じてすべての場所でunsignedを検索して追加します。次に、ダンプを同じデータベースに復元します。復元する前に、そこからすべてのテーブルを削除してダンプします。

于 2013-08-10T11:41:37.123 に答える
4

私はいくつかの主キーが署名されたという同じ問題を抱えていたプロジェクトを引き継ぎ、関連する外国の分野も署名されました。

@Devartアプローチを使用しましたが、プロセス全体を自動化することができました。をクエリしinformation_schemaて追加のSQLステートメントを生成し、「カットアンドペースト」して後で実行することができました。

SQLステートメントを生成して、すべての制約を削除します

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;

UNSIGNEDidに変更する必要がある列を変更します

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';

を指す外国のフィールドを変更する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'
);

(このステートメントでは、すでに署名されていない場合でも、すべてが誤って署名されていないように変更されていますが、これによって問題が発生することはありません)

必要なすべての制約を再挿入します

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';

これらのSQLステートメントに細心の注意を払ってください。スキーマに合わせて変更する必要がある場合があります。たとえば、プライマリIDが「id」と呼ばれることを前提としています。

また、実際の出力を実行する前に、これら4つのステートメントすべてを実行する必要があります。

MySQL5.6の使用

于 2017-11-07T23:58:52.787 に答える
2

これを試して
ALTER TABLE 'users' MODIFY 'id' UNSIGNED NOT NULL AUTO_INCREMENT'

于 2012-05-31T12:26:49.067 に答える
0

MySQLWorkbenchを使用するとこれを実行できます。PRIMARY KEYと、外部キー参照を持つすべてのテーブルのすべての列を変更する必要があります。

YMMVという多くのシナリオで機能することがわかりました。

于 2013-12-30T11:49:21.513 に答える
0

以下は、列がどのように変更されているかによって異なりますが、多くの状況で機能します

-- disable fk constraints
SET FOREIGN_KEY_CHECKS=0;

ALTER TABLE 'table' MODIFY 'column'....

-- re-enable fk constraints
SET FOREIGN_KEY_CHECKS=1;

FKが無効になる場合、これは機能しない可能性があります。その場合、FKを削除/再作成する必要があります。

ALTER TABLE 'table' DROP FOREIGN KEY FK_xxxxxxxxxxx;

ALTER TABLE 'table' MODIFY 'column'....

ALTER TABLE 'table'
  add constraint FK_xxxxxxxxxxx
foreign key ('key-column') references 'other table' ('key-column');
于 2018-07-26T11:40:11.877 に答える