1

の外部キーを怒らせずに anindex(col1, col2, col3)を anに変更したい。どうすればいいのですか?index(col1)col1

私のアプローチは、インデックスを削除して作成することでした。ただし、実行中に外部キーに失敗します。スキーマをアップグレードして元に戻す手順は何ですか?


オリジナル:

  `sid` int(11) NOT NULL DEFAULT '0',
  `cid` int(11) NOT NULL DEFAULT '0',
  `uid` int(11) NOT NULL DEFAULT '0',
  ...
  UNIQUE KEY `User_sid` (`sid`,`cid`,`uid`),
  ...
  CONSTRAINT `User_ibfk_1` FOREIGN KEY (`sid`) REFERENCES `SolrMap` (`sid`)

目的:

  ...,
  `sid` int(11) NOT NULL DEFAULT '0',
  `cid` int(11) NOT NULL DEFAULT '0',       ####ONE LESS COLUMN
  `password_reset_valid_until` datetime DEFAULT NULL,
  `password_reset_id` char(24) DEFAULT NULL,
  ...
  KEY `User_sid` (`sid`)  ####NEW KEY
  ####WANT NEW FOREIGN KEY

そして、これは私が試して失敗したものです:

ALTER TABLE `User` 
        DROP INDEX `User_sid`, 
        ADD INDEX `User_sid` (`sid`) USING BTREE,
        DROP COLUMN `uid`;

そして、これが失敗する理由です:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
121013  8:27:39 Error in foreign key constraint of table friday/User:
there is no index in the table which would contain
the columns as the first columns, or the data types in the
table do not match the ones in the referenced table
or one of the ON ... SET NULL columns is declared NOT NULL. Constraint:
,
  CONSTRAINT "User_ibfk_1" FOREIGN KEY ("sid") REFERENCES "SolrMap" ("sid")
InnoDB: Renaming table `friday`.<result 2 when explaining filename '#sql-6fd_2f12e'> to `friday`.`User` failed!
4

2 に答える 2

0

外部キーのチェックまたは制約を無効にしてみましたか

 SET foreign_key_checks = 0;

 ALTER TABLE `User` 
    DROP INDEX `User_sid`, 
    ...........

 SET foreign_key_checks = 1;

続きを読むhttp://gauravsohoni.wordpress.com/2009/03/09/mysql-disable-foreign-key-checks-or-constraints/

于 2012-10-13T20:26:50.330 に答える
0
ALTER TABLE `User` 
        ADD INDEX `idx_sid` (`sid`) USING BTREE,
        DROP INDEX `User_sid`, 
        DROP COLUMN `uid`;

これにより、古いインデックスを削除するsid 前に、インデックスがまだ残っていることが保証されます。


http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.htmlから:

InnoDB では、外部キーのチェックが高速になり、テーブル スキャンが不要になるように、外部キーと参照キーにインデックスが必要です。参照テーブルには、外部キー列が同じ順序で最初の列としてリストされているインデックスが必要です。このようなインデックスが存在しない場合は、参照テーブルに自動的に作成されます。外部キー制約を適用するために使用できる別のインデックスを作成すると、このインデックスは後でサイレントに削除される可能性があります。index_name が指定されている場合は、前述のように使用されます。

于 2012-10-18T14:47:59.120 に答える