3

主キーを変更しようとしているテーブルがあります。これがテーブル定義です。

CREATE TABLE `tbl_customer` (
  `PersonId` int(11) NOT NULL,
  `Id` int(10) unsigned NOT NULL,
  `Name` varchar(100) collate utf8_spanish_ci NOT NULL,
  `Alias` varchar(50) collate utf8_spanish_ci NOT NULL,
  `Phone` varchar(30) collate utf8_spanish_ci default NULL,
  `Phone2` varchar(30) collate utf8_spanish_ci default NULL,
  `Email` varchar(50) collate utf8_spanish_ci default NULL,
  `Email2` varchar(50) collate utf8_spanish_ci default NULL,
  `RFC` varchar(13) collate utf8_spanish_ci default NULL,
  `AddressStreetName` varchar(45) collate utf8_spanish_ci default NULL,
  `AddressStreetNumber` varchar(45) collate utf8_spanish_ci default NULL,
  `AddressCityWard` varchar(45) collate utf8_spanish_ci default NULL,
  `AddressCityName` varchar(45) collate utf8_spanish_ci default NULL,
  `AddressStateName` varchar(45) collate utf8_spanish_ci default NULL,
  `AddressCountryName` varchar(45) collate utf8_spanish_ci default NULL,
  `AddressPostalCode` int(10) default NULL,
  `IsDistributor` tinyint(1) NOT NULL default '0' COMMENT '1 = Is Distributor, 0 = Is Not Distributor',
  `ParentCustomerId` int(10) NOT NULL default '11' COMMENT 'Our Id is 11, so by default, all customers right now are our children.',
  PRIMARY KEY  (`Id`),
  KEY `fk_tbl_cliente_tbl_cliente1_idx` (`ParentCustomerId`),
  KEY `fk_tbl_cliente_tbl_person1_idx` (`PersonId`),
  KEY `PersonId` (`PersonId`),
  KEY `PersonId_2` (`PersonId`),
  CONSTRAINT `fk_tbl_cliente_tbl_cliente1` FOREIGN KEY (`ParentCustomerId`) REFERENCES `tbl_customer` (`PersonId`),
  CONSTRAINT `fk_tbl_cliente_tbl_person1` FOREIGN KEY (`PersonId`) REFERENCES `zapata`.`tbl_person` (`Id`) ON DELETE NO ACTION ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci COMMENT='''Customer'' refers to a person or entity to which we provide '$$

さて、私が最初に試みたとき:

ALTER TABLE `tbl_customer` DROP PRIMARY KEY;

PRIMARY KEYIdです。私がそれを落とそうとしたとき、私は得ました。

Error Code: 1025. Error on rename of './services/#sql-29a_218cc7f' to './services/tbl_customer' (errno: 150)

FOREIGN KEYそのため、このテーブルと列を参照しているすべての制約を削除しても、同じエラーが発生しました。私も行って、これをSHOW ENGINE INNODB STATUS見つけました:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
130226 14:41:11 Error in foreign key constraint of table services/tbl_employee_shift:
there is no index in referenced table which would contain
the columns as the first columns, or the data types in the
referenced table do not match to the ones in table. Constraint:
,
  CONSTRAINT fk_tbl_employee_shift_tbl_customer1 FOREIGN KEY (CustomerId) REFERENCES services.tbl_customer (Id) ON UPDATE CASCADE

ただし、テーブルservices.tbl_employee_shiftは存在しません(一度は存在していましたが、この変更を試みる数週間前に削除されました)。だから私は続けて...

CREATE TABLE services.tbl_employee_shift(
    CustomerId INT (11)
);
ALTER TABLE services.tbl_employee_shift ADD CONSTRAINT fk_tbl_employee_shift_tbl_customer1 FOREIGN KEY (CustomerId) REFERENCES avatar.tbl_cliente (Id);
ALTER TABLE services.tbl_employee_shift DROP FOREIGN KEY fk_tbl_employee_shift_tbl_customer1;

そしてそれは機能します...しかしそれは必要な情報を修正しません、一見InnoDBはまだ制約fk_tbl_employee_shift_tbl_customer1が生きていると信じているので、「一貫性を保つために主キーのドロップを防ぎます」...私はMySQL5.0を使用しています.95。

編集:この問題は未解決になり、回避されました

この問題は、データベースを新しいサーバー(同じmysqlバージョン)に移行した場合にのみ修正できました。ゴースト外部キー(fk_tbl_employee_shift_tbl_customer1)への参照が壊れているかゴーストであるため、列が削除されなかったようです。この壊れた/ghostfkは新しいサーバーになかったので、問題なく列を削除できました。バグだったと思いますが、残念ながら再現できません。

4

4 に答える 4

3

が 0 に設定されてtbl_employee_shiftいる間にドロップしたように聞こえます。foreign_key_checks

0 に設定foreign_key_checksすると、データ定義ステートメントにも影響DROP SCHEMAします。スキーマ外のテーブルによって参照される外部キーを持つテーブルがスキーマに含まれている場合でもスキーマをDROP TABLE削除し、他のテーブルによって参照される外部キーを持つテーブルを削除します。

この動作は文書化されているため、仕様によるものであり、バグではないと見なす必要があります。

于 2013-03-06T13:02:45.053 に答える
1

このエラーは、外部キーが正しく作成されていない場合に発生します。SQL は正しいです。ローカルホストでスクリプトを実行すると、同じエラーが発生します。解決策は、テーブル tbl_person がエンジン「InnoDB」で作成されたことを確認することです。

挨拶

于 2013-03-11T16:16:09.867 に答える
0

今日はこの問題に対処しました。スキーマ情報テーブルのいずれにも、影響を受けた 2 つのテーブルの兆候はありませんでした。FK を探してさまざまなシステム データベースを検索しましたが、役に立ちませんでした。最終的に、データベースの削除はすぐに機能しました。

于 2014-09-23T23:08:06.960 に答える
-1

同様のエラーがありました.mysqlが必要とするのは、キーと外部の両方、タイプとサイズが一致していることです. person.id int (10) は (10) の service_customer.person_id にマップする必要があります。タイプとサイズが異なる場合、mysql はエラーを出します。

于 2013-03-12T08:05:32.070 に答える