微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

首次创建表时创建表之间的关系

如何解决首次创建表时创建表之间的关系

我使用MysqL 在我的数据库中 我想创建多个具有删除和更新关系的表

举个例子 我想将配置文件链接用户表 将 users 表中的 mm_id_user 列与配置文件表中的 mm_id_profile 列关联

我实际上尝试做的是这个例子,但它对我不起作用
https://stackoverflow.com/a/260453/10206991
https://stackoverflow.com/a/9796950/10206991

用于创建users表的代码并成功创建表

CREATE TABLE users (
    mm_email VARCHAR(255) NOT NULL,mm_id_user int NOT NULL AUTO_INCREMENT,mm_name VARCHAR(25) NOT NULL,mm_password VARCHAR(255) NOT NULL,mm_code_reset_pass VARCHAR(100) NOT NULL,mm_code_check_email VARCHAR(100) NOT NULL,mm_status CHAR(1) NOT NULL DEFAULT '0',mm_date_create_account TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,mm_date_last_login TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,mm_is_login CHAR(1) NOT NULL DEFAULT '0',PRIMARY KEY (mm_id_user,mm_email)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 DEFAULT COLLATE utf8_unicode_ci;

用于创建配置文件表的代码。他创建表失败

CREATE TABLE profiles (
    mm_id_profile VARCHAR(255) NOT NULL,mm_image_user TEXT NOT NULL,mm_num_stores_all VARCHAR(4) NOT NULL,mm_num_stores_exist VARCHAR(4) NOT NULL,mm_name_public VARCHAR(25) NOT NULL,mm_email_public VARCHAR(255) NOT NULL,mm_phone_public VARCHAR(20) NOT NULL,mm_location_public TEXT NOT NULL,mm_update_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,INDEX index_profiles(mm_name_public,mm_email_public),PRIMARY KEY (mm_id_profile),FOREIGN KEY (mm_id_profile) REFERENCES users(mm_email) ON DELETE CASCADE
)ENGINE=InnoDB DEFAULT CHARSET=utf8 DEFAULT COLLATE utf8_unicode_ci;

但是如果您从配置文件表中删除以下行,它将被创建 但是这两个表肯定没有关系

FOREIGN KEY (mm_id_profile) REFERENCES users(mm_email) ON DELETE CASCADE

这是创建配置文件表时出现的错误信息

#1005 - Can't create table `mustforu_test`.`profiles` (errno: 150 "Foreign key constraint is incorrectly formed") (Details…)

解决方法

没有理由将 mm_id_usermm_email 都放在 users 的主键中。如果您希望电子邮件是唯一的,则它应该有自己的唯一索引。您当前的主键将允许具有不同 ID 的重复电子邮件。

CREATE TABLE users (
    mm_email VARCHAR(255) NOT NULL,mm_id_user int NOT NULL AUTO_INCREMENT,mm_name VARCHAR(25) NOT NULL,mm_password VARCHAR(255) NOT NULL,mm_code_reset_pass VARCHAR(100) NOT NULL,mm_code_check_email VARCHAR(100) NOT NULL,mm_status CHAR(1) NOT NULL DEFAULT '0',mm_date_create_account TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,mm_date_last_login TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,mm_is_login CHAR(1) NOT NULL DEFAULT '0',PRIMARY KEY (mm_id_user),UNIQUE KEY (mm_email)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 DEFAULT COLLATE utf8_unicode_ci;

mm_email 自己的索引将允许 profiles 中的外键工作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。