これらのスクリプトを使用して作成された 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 レコードが存在する必要があるため、ユーザー名/パスワードの組み合わせを重複させることはできません。したがって、各アカウントは一意になります。