0

MySql(Innodb) でテーブルの外部キーを生成しようとしているときに、いくつかの問題が発生しています。それらを手伝ってくれませんか?

参照テーブル:

*create table entity
{
  PID INT(20) auto inc not null,
  ENTITYID INT(20) not null,
  details VARCHAR(100) not null,
  primary key(PID,ENTITYID)
}
create table user
{
 USERID int(20) auto inc not null,
 NAME VARCHAR(45) not null,
 joindate DATETIME not null,
 location VARCHAR(100) not null,
 primary key(USERID,NAME) not null
 }*

Referencing table:
*create table C
{
  ENTITYID INT(20) not null,
  NAME VARCHAR(45) not null,  
  foreign key ENTITYID_C constraint ENTITYID references entity(ENTITYID) on delete cascade,
  foreign key name_C constraint NAME references user(NAME) on delete cascade,
  primary key(ENTITYID,NAME)  
}*

対応するエンティティまたは対応するユーザーが削除されたときに C のエントリを削除する必要があるため、テーブル C に 2 つの外部キーが必要です。

テーブル CI を作成しようとすると、次のエラーが発生します: ERROR 1005: Can't create table (errno: 150)。これは、mysql 仕様に定められたルールを順守していないためだと思われます。 http://dev.mysql.com/doc/refman/5.4/en/innodb-foreign-key-constraints.html

仕様の以下の部分/ルールはどういう意味ですか?

「InnoDB では、外部キーのチェックが高速になり、テーブル スキャンが不要になるように、外部キーと参照キーのインデックスが必要です。参照テーブルには、外部キー列が最初の列として同じ順序でリストされているインデックスが必要です。 ."

テーブル C の外部キーは、エンティティ テーブルとユーザー テーブルの主キーに対応する必要があるということですか。エンティティ テーブルの ENTITYID が主キーの最初であり、ユーザー テーブルの NAME が主キーの最初である必要があります。つまり、主キーの宣言を次のように書き直す必要がありますか?

entity table -->    primary key(ENTITYID,PID)   , 
user  table -->  primary key(NAME,USERID)

その場合、上記のようにキー宣言を並べ替えようとすると、エラー 1075 が発生します。

自動インクリメント キー (サロゲート キー) をインデックス順リストの 2 番目にして、仕様に準拠するにはどうすればよいですか?

ありがとうございました !

4

3 に答える 3

1

エンティティとユーザーの主キーが正しくないと思います。主キーとインデックスが混同されていると思います。

両方のテーブルに自動インクリメント列があります。それらが主キーである必要があると思います-ENTITYの場合はPID、USERの場合はUSERID。ENTITYIDを使用してENTITYをクエリする場合、またはNAMEを使用してUSERをクエリする場合は、必ず両方のインデックスを作成してください。

ここで、テーブルCは、ENTITYとUSERの間の多対多の関係を定義します。Cには、PIDとUSERIDを指す2つの列があり、それぞれに外部キーがあります。Cの主キーは、2つの組み合わせにすぎません。

このような:

create table entity
{
    pid int(20) auto inc not null,
    primary key(pid)
};

create table user
{
    userid int(20) auto inc not null,
    primary key(userid)
};

create table user_entity
{
    entity_id int(20) not null,
    user_id int(20) not null,  
    primary key(entity_id, user_id)  
    foreign key entity_id references entity(pid) on delete cascade,
    foreign key user_id references user(userid) on delete cascade
};
于 2009-10-16T01:04:25.043 に答える
1

オリー・サンダースは正しいです。InnoDB テーブルを削除/作成する前に、まずすべての制約を削除してください。

ALTER TABLE tbl_name
    ADD [CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

ソース:テーブル構文の変更

于 2011-01-21T09:15:22.163 に答える
0

これを行うときはいつでも、最初にすべてのテーブルを定義してから、後で個別のALTERクエリを使用して制約を適用する方が確実に良いことがわかりました。「このテーブルが最初に存在する必要がある」という問題など、多くの問題を回避できます。

于 2009-10-16T01:10:16.997 に答える