0

これが初心者の質問である場合はお詫びしますが、しばらくの間この問題を解決できず、MySQLをよりよく理解している人が次の問題を解読するのに役立つことを願っています:

私は2つのテーブルを維持したいのでユーザーは自分の設定を定義できますが、管理者はそれらの設定へのアクセス権を維持できます。また、管理者が特定の権限を削除した場合に、設定テーブルが更新されることを確認したいと思います

。2つのテーブルは次のとおりです。

main_access
+--------------+---------+------+-----+---------+-------+
| Field        | Type    | Null | Key | Default | Extra |
+--------------+---------+------+-----+---------+-------+
| nav_location | int(11) | NO   | PRI | NULL    |       |
| user_id      | int(11) | NO   | PRI | NULL    |       |
+--------------+---------+------+-----+---------+-------+

main_prefs
+--------------+---------+------+-----+---------+-------+
| Field        | Type    | Null | Key | Default | Extra |
+--------------+---------+------+-----+---------+-------+
| nav_location | int(11) | NO   | PRI | NULL    |       |
| user_id      | int(11) | NO   | PRI | NULL    |       |
+--------------+---------+------+-----+---------+-------+

私がこれを実行すると、両方に一意のインデックスがあります。

CREATE TABLE IF NOT EXISTS main_access (
    nav_location    integer not null,
    user_id         integer not null,
    unique index uk_access (nav_location, user_id)
);

CREATE TABLE IF NOT EXISTS main_pref (
    nav_location    integer not null,
    user_id         integer not null,
    unique index uk_pref (nav_location, user_id)
);

そのため、上記のテーブルを持つuk_accessとuk_prefが作成されています。しかし、私が実行すると:

ALTER TABLE main_pref 
ADD CONSTRAINT FK_access1 
FOREIGN KEY(uk_pref) REFERENCES main_access(uk_access) 
ON UPDATE CASCADE 
ON DELETE CASCADE;

「エラー1072(42000):キー列'uk_pref'がテーブルに存在しません」というエラーが表示されます。これは、私には、取得する意味がありません。テーブルを作成した後に次のコマンドも実行したので、キーが存在することはわかっています。

ALTER TABLE main_pref ADD UNIQUE INDEX uk_pref (nav_location, user_id);

重複キーの警告が表示されました。他のテーブルでも同じことをしました。
また、両方のテーブルで一意のインデックス名を同じにしてみました。つまり、私はそれらを両方とも作成しましたが、uk_pref無駄になりました。同じエラー。
これは私が見逃している本当に単純な問題のように感じますが、それを見ることができませんでした。私が犯している間違いを別の目で指摘してくれることを願っています。どんな助けでも大歓迎です!

私は同様の問題を探しましたが、同じ問題に対処するものはここには見つかりませんでした。

編集:AJはこれを指摘しました、そして私がそれを試したことを言及するのを忘れました:
私も(最初に)一意のキーの設定をバイパスしようとし、次のことをしました:

ALTER TABLE main_pref 
ADD CONSTRAINT FK_access1 
FOREIGN KEY(user_id, nav_location) REFERENCES main_access(user_id, nav_location) 
ON UPDATE CASCADE 
ON DELETE CASCADE;

そして、MySQLは構文エラーを返しました。

4

1 に答える 1

2

キー定義の列を間違った順序で指定しました

ALTER TABLE main_pref 
ADD CONSTRAINT FK_access1 
FOREIGN KEY(nav_location,user_id) REFERENCES main_access(nav_location,user_id) 
ON UPDATE CASCADE 
ON DELETE CASCADE;

これは正常に機能します

http://sqlfiddle.com/#!2/16751

CREATE TABLEFK列は、ステートメントのキー定義と同じ順序で指定する必要があります。言い換えると、元の投稿のように、複合インデックスを(nav_location,user_id)使用してFK定義を満たすことはできません(user_id,nav_location)

于 2012-09-24T01:06:14.213 に答える