1

pk でユーザー テーブルを参照する、deletedBy という外部キー列を持つ mail というテーブルがあります。新しいメールを作成するときに、メールが削除されていないため、このフィールドを null に設定したいのですが、そうすると外部キー制約エラー エラーが発生します。

エラーの内容は理解できましたが、どうすれば回避できますか?

テーブル:-

CREATE TABLE `mail` (
  `pk` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `from` int(11) unsigned NOT NULL,
  `to` int(11) unsigned NOT NULL,
  `subject` varchar(255) NOT NULL,
  `message` text NOT NULL,
  `dt` datetime NOT NULL,
  `read` enum('0','1') NOT NULL DEFAULT '0',
  `deletedby` int(11) unsigned DEFAULT '0',
  PRIMARY KEY (`pk`),
  KEY `from_mail__users_pk` (`from`),
  KEY `to_mail__users_pk` (`to`),
  KEY `deletedby_mail__users_pk` (`deletedby`),
  CONSTRAINT `deletedby_mail__users_pk` FOREIGN KEY (`deletedby`) REFERENCES `user` (`pk`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `from_mail__users_pk` FOREIGN KEY (`from`) REFERENCES `user` (`pk`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `to_mail__users_pk` FOREIGN KEY (`to`) REFERENCES `user` (`pk`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_bin

エラーメッセージ:-

 ERROR 1452: Cannot add or update a child row: a foreign key constraint fails (`ajfit`.`mail`, CONSTRAINT `deletedby_mail__users_pk` FOREIGN KEY (`deletedby`) REFERENCES `user` (`pk`) ON DELETE NO ACTION ON UPDATE NO ACTION)
SQL Statement:
 INSERT INTO `ajfit`.`mail` (`from`, `to`, `subject`, `message`, `read`) VALUES (31, 30, 'test', 'test', '0')

ありがとう

アンドリュー

4

3 に答える 3

4

の値を指定していないためdeletedby、used のDEFAULT値です0。しかし、(おそらく) usera が 0 のテーブルにはレコードがないpkため、外部キー制約は (正しく) 失敗します。

あなた自身が言ったように、代替値が提供されるまで外部キー制約がチェックされないようにdeletedby、のDEFAULT値が必要です。NULL

ALTER TABLE mail MODIFY deletedby int(11) unsigned DEFAULT NULL;
于 2012-05-18T12:18:13.547 に答える
2

テーブルのid列に外部キーがあるため、テーブルのdeletedby列にはmailテーブルのid列の値が含まれている必要があります。useruser

mail外部キー制約は NULL 値を受け入れるため、1 つの方法は、テーブルに新しい行を挿入するときに、deletedby 列に NULL 値を設定することです。

于 2012-09-03T09:07:39.050 に答える
1

ユーザー テーブルに、コード 0 が付加されたエントリはありますか? 私には、テーブルがエントリ 0 を見つけようとして運が悪いように見えるからです。

于 2012-05-18T12:19:24.170 に答える