5

そのように作成されたMySQL InnoDBにテーブルがあります:

CREATE TABLE `users` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `type` enum('MANUAL','FACEBOOK') NOT NULL DEFAULT 'MANUAL',
  `role` enum('COOK','HOST','ALL') NOT NULL DEFAULT 'ALL',
  `about_me` varchar(1000) DEFAULT NULL,
  `food_preferences` varchar(1000) DEFAULT NULL,
  `cooking_experience` varchar(1000) DEFAULT NULL,
  `with_friend` bit(1) DEFAULT b'0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8

次に、そのようなステートメントでテーブルを追加しようとしました(テーブルの作成中に問題があったため、外部キーは追加されませんでした):

CREATE TABLE `messages` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `from` bigint(20) NOT NULL,
  `to` bigint(20) NOT NULL,
  `content` varchar(10000) NOT NULL,
  `timestamp_sent` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `timestamp_read` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

テーブルを作成したら、最後に外部キーを追加し'from''to'フィールドを参照する'users'.'id'フィールドを追加する必要があります。

ALTER TABLE `messages` 
  ADD CONSTRAINT `messages_users_fk`
  FOREIGN KEY (`from` , `to` )
  REFERENCES `users` (`id` , `id` )
  ON DELETE SET NULL
  ON UPDATE CASCADE
, ADD INDEX `messages_users_fk_idx` (`from` ASC, `to` ASC)

私が得るエラーは次のとおりです。

エラー: エラー 1822: 外部キー制約の追加に失敗しました。参照テーブル 'users' に制約 'messages_users_fk' のインデックスがありません。

しかし、「users」テーブルにはPRIMARYインデックスがあり'id'ます...

また、より小さなステップを作成して、フィールドだけに外部キーを追加しようとしました'from':

ALTER TABLE `messages` 
  ADD CONSTRAINT `messages_users_fk`
  FOREIGN KEY (`from` )
  REFERENCES `users` (`id` )
  ON DELETE SET NULL
  ON UPDATE CASCADE
, ADD INDEX `messages_users_fk_idx` (`from` ASC) ;

エラーはわずかに異なります。

エラー: エラー 1825: テーブル 'messages' に外部キー制約を追加できませんでした。FOREIGN KEY 制約 'cook4food/messages_users_fk' のオプションが正しくありません。

フィールドの型は、bigint(20) NOT NULL他の StackOverflow スレッドで問題の原因として示唆されたものと同じ ( ) です。私のテーブルはパーティション化されていません (MySQL のマニュアルでは、これは InnoDB で外部キー制約を使用するための制限として述べられています)。現在'messages'、テーブルには行が保存されていないため、保存されたデータが問題になることはありません。困っています、助けてください。

4

3 に答える 3

15

適切な権限を持っている場合は、次のクエリを発行できます。

SHOW ENGINE innodb STATUS

...これにより、(他の情報とともに)エラーの正確な詳細がわかります。

------------------------
LATEST FOREIGN KEY ERROR
------------------------
130311 13:30:06 Error in foreign key constraint of table test/#sql-71c_6:

  FOREIGN KEY (`from` , `to` )
  REFERENCES `users` (`id` , `id` )
  ON DELETE SET NULL
  ON UPDATE CASCADE
, ADD INDEX `messages_users_fk_idx` (`from` ASC, `to` ASC):
You have defined a SET NULL condition though some of the
columns are defined as NOT NULL.

親レコードの削除では、列が次の理由で子レコードを NULL にすることはできませんNOT NULL:

  `from` bigint(20) NOT NULL,
  `to` bigint(20) NOT NULL,

編集:さらに、単一の複合キーの目的がわかりません。代わりに 2 つの単一のキーが必要だと思います。

于 2013-03-11T12:34:13.067 に答える
0

REFERENCESユーザー(ID ,ID)

無効な外部キー (id、id) を作成しようとしています。複合インデックス (複数の列を含むもの) に含まれる列は、同じ列を繰り返すことはできません。少なくとも私はそれを見たことがありません。

FROM 用と TO 用の 2 つの個別の外部キーを作成し、それぞれがユーザーを指すようにします。

于 2013-03-11T12:33:47.483 に答える
0

私たちが見たとおり、

from子列が NULLでない場合、子レコードに SET NULL を定義することはできませんto

したがって、次の 2 つのステートメントで外部キーを作成しようとすると、messagesテーブルに外部キーが必要です。

1>

ALTER TABLE `messages`  ADD CONSTRAINT `messages_users_from_fk`   FOREIGN KEY (`from` )   REFERENCES `users` (`id` )  ON DELETE CASCADE ON UPDATE CASCADE, ADD INDEX `messages_users_fk_idx` (`from` ASC) ;

2>

ALTER TABLE `messages`  ADD CONSTRAINT `messages_users_to_fk`   FOREIGN KEY (`to` )   REFERENCES `users` (`id` )  ON DELETE CASCADE ON UPDATE CASCADE, ADD INDEX `messages_users_fk_to_idx` (`to` ASC) ;

これらのステートメントがお役に立てば幸いです。

于 2013-03-11T12:55:25.533 に答える