0

ここで基本的なことを誤解したかどうかはわかりませんが、次のようになります。

個人テーブル (個人には、名前、住所などの典型的な属性があります) と、選出された代表者のテーブルがあります。代表者には、追加の属性があります (たとえば、副代表者/代理代表者、または彼ら自身が代理者である誰か)。多くの人がいて、少数の代表者しかいない (n<200) ため、すべての人に共通するすべての属性を person テーブルに保存し、代表者固有のデータのみを Representatives-table に保存します。代表者のすべての「データ」は、個人テーブルとの関係です。この表は、誰が投票を許可されているか (および誰が彼の代理を許可されているか、または彼が代理を務めているか) の現在のステータスを反映しているだけです。

representatives 
(numbers are the pk for persons, and empty cells here are NULL in the db)
_____________________________
|id|has_substitute|is_sub_for|
| 1|           2  |          |
| 2|              |        1 |
| 3|              |          |
| 5|              |          |

そのため、代表者が投票権を失った日が来て、代表者から彼を削除する必要がありますが、人物テーブルには含まれていません (彼はまだ人物です)。彼がサブになっている人、または彼のサブであった人にも同じことが言えます。彼らは私のスキーマでは FK ですが、個人として削除するのではなく、代表者との関係だけを削除したいと考えています。代表者テーブルの行だけ。

DELETE FROM representatives WHERE id=1;

すべてうまくいかない。「親行を削除または更新できません: 外部キー制約が失敗しました」しかし、個人を削除するつもりはなく、「代表者」テーブルで作成された関係だけを削除するつもりです。

  1. mysqlのDELETE FROM と関係を無視する (行を削除するだけ) 関数はありますか?

  2. 私はこれを間違ってモデリングしていますか? もしそうなら、より良い方法は何でしょうか?

PS: テーブルの作成情報は次のとおりです。

CREATE TABLE `representatives` (
  `person_id` varchar(33) NOT NULL,
  `permanent_substitute_for_id` varchar(33) DEFAULT NULL,
  `temporarily_substitute_for_id` varchar(33) DEFAULT NULL,
  PRIMARY KEY (`person_id`),
  KEY `representatives_250f5a24` (`permanent_substitute_for_id`),
  KEY `representatives_79c95594` (`temporarily_substitute_for_id`),
  CONSTRAINT `permanent_substitute_for_id_5c64807b` FOREIGN KEY (`permanent_substitute_for_id`) REFERENCES `persons` (`id`),
  CONSTRAINT `person_id_refs_id_5c64807b` FOREIGN KEY (`person_id`) REFERENCES `persones` (`id`),
  CONSTRAINT `temporarily_substitute_for_id_5c64807b` FOREIGN KEY (`temporarily_substitute_for_id`) REFERENCES `persones` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `persones` (
  `id` varchar(33) NOT NULL,
  `first_name` varchar(150) NOT NULL,
  ..[more stuff]..
  PRIMARY KEY (`id`),
  KEY `fylkesperspektiv_personer_70fdfe4` (`fylke_id`),
  KEY `fylkesperspektiv_personer_3ab19c51` (`parti_id`),
  CONSTRAINT `fylke_id_refs_id_36bce012` FOREIGN KEY (`fylke_id`) REFERENCES `fylkesperspektiv_fylker` (`id`),
  CONSTRAINT `parti_id_refs_id_c381e045` FOREIGN KEY (`parti_id`) REFERENCES `fylkesperspektiv_partier` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
4

2 に答える 2

1

エラー メッセージは、 withオプション (デフォルト)persons.representative_idを外部キーとして持っていることを示唆しています。おそらく代わりに、代表者を削除して個人データを保持できるようにしたいでしょう。representative.idON DELETE RESTRICTON DELETE SET NULL

representative.person_idまたは、への外部キーとして持つこともできますperson.id

于 2012-12-03T16:14:19.017 に答える
0

rep_id各人物の列を定義し、それをrepテーブルに結び付けます。

ALTER TABLE person
    ADD CONSTRAINT FK_person_rep
    FOREIGN KEY (rep_id) REFERENCES rep(rep_id)
    ON UPDATE CASCADE ON DELETE SET NULL;

また、rep テーブルの冗長な 列は使用せず、同じテーブル内でのみ使用して関連付けます。has_substituteis_sub_forrep_id

ALTER TABLE rep
ADD CONSTRAINT FK_rep_rep
FOREIGN KEY (is_sub_for) REFERENCES rep(rep_id)
ON DELETE CASCADE ON UPDATE CASCADE;

このようにして、担当者が削除されると、その担当者の担当者の rep_id 列がすべて NULL に更新され、同じテーブル内の担当者が削除されます。rep_id が変更された場合 (決して発生するわけではありませんが、念のため)、更新は両方のテーブルの子にカスケードされます。

于 2012-12-03T16:28:28.213 に答える