1

これらのスクリプトを使用して作成された 2 つのテーブル:

create table user_auth
(
    username varchar(255) NOT NULL,
    password varchar(255) NOT NULL,
    user_id varchar(36) NOT NULL,
    PRIMARY KEY(username, password)
)engine=innodb;

create table user
(
    user_id varchar(36) NOT NULL,
    PRIMARY KEY(user_id),
    FOREIGN KEY(user_id) REFERENCES user_auth(user_id) ON DELETE CASCADE
)engine=innodb;

次のエラーが表示されます: テーブル 'xxx.user' を作成できません (errno: 150)

外部キー エラーです。

代わりにこれを行う場合(外部キー制約を削除しますが、引き続きuser_authを参照します):

create table user_auth
(
    username varchar(255) NOT NULL,
    password varchar(255) NOT NULL,
    user_id varchar(36) NOT NULL,
    PRIMARY KEY(username, password)
)engine=innodb;

create table user
(
    user_id varchar(36) NOT NULL REFERENCES user_auth(user_id) ON DELETE CASCADE,
    PRIMARY KEY(user_id),
)engine=innodb;

すべてが桃色ですが、 user_authに対応するキーがなくてもuser_idをユーザーテーブルに挿入できます。これにより、参照整合性に穴ができます。

キックのために、私はこれを行うと言います(複合キーを削除し、user_idをuser_authの主キーにします):

create table user_auth
(
    user_id varchar(36) NOT NULL,
    PRIMARY KEY(username, password)
)engine=innodb;

create table user
(
    user_id varchar(36) NOT NULL,
    PRIMARY KEY(user_id),
    FOREIGN KEY(user_id) REFERENCES user_auth(user_id) ON DELETE CASCADE
)engine=innodb;

これも機能しますが、一意性を確保するためのユーザー名とパスワードの複合体はありません。

MySQL がどのように機能するかについて、かなり重要な何かが欠けているような気がします。啓発してください。

御時間ありがとうございます!

アップデート

回答にリンクされている記事 ypercube では、ポイント 3 で PK の順序と対応する FKが同じでなければならないことが述べられています。user_id次の順序でPK として追加user_authすると、スクリプトが機能します。

create table user_auth
(
    username varchar(255) NOT NULL,
    password varchar(255) NOT NULL,
    user_id varchar(36) NOT NULL,
    PRIMARY KEY(user_id, username, password)
)engine=innodb;

create table user
(
    user_id varchar(36) NOT NULL,
    PRIMARY KEY(user_id),
    FOREIGN KEY(user_id) REFERENCES user_auth(user_id) ON DELETE CASCADE
)engine=innodb;

したがってSELECT、ユーザーデータを挿入する前にユーザー名/パスワード/user_id レコードが存在する必要があるため、ユーザー名/パスワードの組み合わせを重複させることはできません。したがって、各アカウントは一意になります。

4

2 に答える 2

1

試す:

create table user_auth
(
    username varchar(255) NOT NULL,
    password varchar(255) NOT NULL,
    user_auth_id varchar(36) NOT NULL,
    PRIMARY KEY(username, password)
)engine=innodb;

create table user
(
    user_id varchar(36) NOT NULL,
    user_username varchar(36) NOT NULL, 
    user_pass varchar(36) NOT NULL, 
    INDEX(user_username, user_pass),
    PRIMARY KEY(user_id),
    FOREIGN KEY(user_username, user_pass) REFERENCES user_auth(username, password) ON DELETE CASCADE
)engine=innodb;

参照: http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

于 2013-01-31T07:33:31.043 に答える