使用以下脚本创建的两个表:
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_id 插入到用户表中,而 user_auth 中没有相应的键,这在我的引用完整性中留下了一个漏洞。
现在踢球说我这样做(删除复合键并使 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中,第三点提到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 记录。